我尝试开始在一个类上使用 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);
如果这个问题看起来有点基本(或者上面的概念看起来有点愚蠢!),我深表歉意 - 我只是在努力理解上面的两条规则如何应用于这种情况。
预先感谢您提供的任何建议!
最佳答案
我会很实用。如果 Smoothie 只是一个数据对象,则不必费心包装它。
FoodMixer 内部有一些东西首先正在创建 Smoothie。如果那是第 3 方组件,我会将其包装起来(如果需要,您可以将类委托(delegate)给静态方法),然后依赖项注入(inject)包装器并在单元测试中模拟它。
然后,您的单元测试将描述 FoodMixer 的行为和职责,独立于 SmoothieMaker(无论是第三方还是其他)。 FoodMixer 的部分职责是向 SmoothieMaker 请求 Smoothie,而不是实际制作 Smoothie 本身。通过模拟它,我们可以表达这种责任和类范围。
如果您的 Smoothie 不仅仅是一个数据对象,而且具有丰富的行为,我也会将其包装在您包装的 SmoothieMaker 中。
现在您已与第 3 方库完全解耦,并且可以作为有用的副产品轻松进行单元测试。
关于c# - 采用 TDD 的第三方组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4292159/