c# - 采用 TDD 的第三方组件

标签 c# unit-testing tdd

我尝试开始在一个类上使用 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/

相关文章:

node.js - 如何让 sinon mock 在不同的调用上返回不同的对象?

java - 测试驱动开发。断言类的内部结构是否正确?

python - pyunit 测试失败,因为方法在传入 5 个参数时只接受 4 个参数

c# - 高效清晰地评估六个条件

c# - Renci.SshNet:在30000毫秒内建立连接失败

java - 模拟类的内部方法

javascript - 有哪些代码质量/代码覆盖率工具可用于检查 Jasmine 中的 Javascript 测试?

c# - 如何查看<returns>标签的内容?

c# - 使用正则表达式在 C# 中查找带有转义引号的引用字符串

ruby-on-rails - Rails 3 的测试框架?