说我有方法
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}}
解决方案应该支持自动更改断言。
答案 0 :(得分:4)
如果PrintStuff
在一个接口中,但你的断言是在一个具体的类中,谁说同样的断言适用于所有的实现?听起来你真正想要的是将合同交给接口而不是具体的类。显然你不能用“普通”的C#代码来做到这一点......
现在,我建议使用支持合同继承的Code Contracts,包括接口。如果您使用的是Visual Studio Premium或Ultimate版本,则可以进行编译时静态检查,确保不违反断言。否则,你会回到嘲笑我相信。现在,如果你使用模拟,我不认为合同会自动被选中,因为它们通常是使用二进制重写来应用的......但是我希望这个领域的工具能够很快得到合理的改进。当然,模拟通常涉及指定您期望的输入,因此无论如何您应该能够确保它们在您编写测试时有效。
您可能还想查看Pex,它会探索您的代码并尝试为您打破它。