断言(合同)和单元测试

时间:2010-05-28 06:12:31

标签: c# unit-testing

说我有方法

public void PrintStuff(string stuff, Color color, PageDimensions dimensions)
{
     Assert.IsNotNull("color");
     Assert.IsNotNull(dimensions);
     Assert.IsTrue(dimensions.width < 20.0);
}

我还有一个方法AnotherMethod()正在调用PrintStuff()。假设PrintStuff()AnotherMethod()正在使用的某些接口中定义AnotherMethod()。问题是:在为AnotherMethod()编写单元测试时,我如何自动化测试PrintStuff()是否未将任何值传递给违反其断言的printer.Expect(x => x.PrintStuff(null, null, null)).CheckAssertions(); ?< / p>

类似的东西:

{{1}}

解决方案应该支持自动更改断言。

1 个答案:

答案 0 :(得分:4)

如果PrintStuff在一个接口中,但你的断言是在一个具体的类中,谁说同样的断言适用于所有的实现?听起来你真正想要的是将合同交给接口而不是具体的类。显然你不能用“普通”的C#代码来做到这一点......

现在,我建议使用支持合同继承的Code Contracts,包括接口。如果您使用的是Visual Studio Premium或Ultimate版本,则可以进行编译时静态检查,确保不违反断言。否则,你会回到嘲笑我相信。现在,如果你使用模拟,我不认为合同会自动被选中,因为它们通常是使用二进制重写来应用的......但是我希望这个领域的工具能够很快得到合理的改进。当然,模拟通常涉及指定您期望的输入,因此无论如何您应该能够确保它们在您编写测试时有效。

您可能还想查看Pex,它会探索您的代码并尝试为您打破它。