Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有TDD的第三方组件_C#_Unit Testing_Tdd - Fatal编程技术网

C# 具有TDD的第三方组件

C# 具有TDD的第三方组件,c#,unit-testing,tdd,C#,Unit Testing,Tdd,我试图开始在一个类上使用TDD,该类会吐出属于第三方组件的对象。然而,我显然有点困惑: a) 使用单元测试时,对象应单独进行测试 b) 第三方组件应包装到适配器中 当为返回属于第三方组件的对象实例的代码编写测试时,这些规则适用吗?例如,以下是目前为止的测试: // Arrange string foodXml = "<food><ingredient>Cabbages</ingredient>" + "<ingredie

我试图开始在一个类上使用TDD,该类会吐出属于第三方组件的对象。然而,我显然有点困惑:

a) 使用单元测试时,对象应单独进行测试

b) 第三方组件应包装到适配器中

当为返回属于第三方组件的对象实例的代码编写测试时,这些规则适用吗?例如,以下是目前为止的测试:

// Arrange
string foodXml = "<food><ingredient>Cabbages</ingredient>" +
                 "<ingredient>Bananas</ingredient></food>";
IFoodMixer mixer = new FoodMixer();

// Act

// Smoothie is the third-party component object
Smoothie urgh = mixer.Mix(foodXml);

// Assert

Assert.AreEquals("Cabbages", urgh.Ingredients[0].Name);
Assert.AreEquals("Bananas", urgh.Ingredients[1].Name);
//排列
string foodXml=“卷心菜”+
“香蕉”;
IFoodMixer mixer=new FoodMixer();
//表演
//Smoothie是第三方组件对象
Smoothie urgh=混合器混合(foodXml);
//断言
Assert.AreEquals(“卷心菜”,urgh.配料[0].Name);
Assert.AreEquals(“香蕉”,urgh.components[1].Name);
抱歉,如果这个问题看起来有点基本(或者如果上面的概念有点傻!)-我只是在努力理解上面的两条规则如何适用于这种情况


提前感谢您提供的任何建议

我会很实用的。如果Smoothie只是一个数据对象,不要费心包装它

在FoodMixer里面有一种东西,它首先是用来制作冰沙的。如果这是第三方组件,我会将其包装起来(如果需要,可以从类委托给静态方法),然后依赖注入包装器,并在单元测试中模拟它

然后,您的单元测试将描述您的FoodMixer的行为和责任,独立于SmoothieMaker(无论是第三方还是其他方)。食品管理员的部分职责是向冰沙制造商索要冰沙,而不是亲自制作冰沙。通过模仿它,我们可以表达责任和类范围

如果您的Smoothie不仅仅是一个数据对象,而且具有丰富的行为,我也会将其包装在包装好的SmoothieMaker中


现在,您已经与第三方库完全解耦,可以轻松地将单元测试作为有用的副产品。

将mockito视为自动创建Mock并验证断言而不是使用适配器的更简单方法。
还有许多关于mockito(和JMocks)的好教程,它们也是很好的TDD教程。

感谢您的快速和详细的回复!问题是Smoothie对象非常复杂,FoodMixer可能会使用它的大部分功能(它的NPOIBTW用于生成Excel文件)。还需要包装吗?感觉它需要重写大部分内容。在这种情况下,我会找出你想要实现的目标,添加一个完成这些任务的包装器,然后将NPOI放入其中。它不必是一对一的代表团。如果包装器本身足够简单,可以通过检查进行测试,或者您正在手动测试包装器,并且包装器不会改变,那么您不需要对包装器本身进行单元测试(因为单元测试并不是真正的测试,而是让事情变得容易改变)。我非常感谢您的回答,拥有一个NPOI适配器将是实现这一点的正确和正确的方法,只是考虑到XML最终将指定NPOI对象的许多特征,以至于它几乎将是它的序列化表示,这似乎是一项巨大的工作。因此,为了开始,我可能会首先返回一个对象的实例,并在测试中检查其属性,然后在可能的情况下研究如何编写/用适配器替换它。您仍然需要为许多第三方类创建适配器,如果它们有实例静态方法,则由其他类私下创建,等等-否则你不能嘲笑他们。此外,作者还标记了这个C#,Mockito和JMock都是Java库(使用Moq表示C#)!嗯,是的,我确实回答了Java,但是你不需要带有模拟对象的适配器。我认为这同样适用于。netFraid不适用。没有.NET的CgLib-所有方法都必须来自接口或是虚拟的(除了虚拟方法外,我们甚至不能在.NET中模拟类)。此外,模拟并不是真正的重点——它是将您自己与第三方库分离,如果您被困在第三方库的API中,您将无法有效地实现这一点。