说我有一个方法
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()
使用的某些接口(interface)中定义的。问题是:在为 AnotherMethod()
编写单元测试时,如何自动测试 AnotherMethod()
不会将任何值传递给 PrintStuff()
违反了它的断言?
类似于:
printer.Expect(x => x.PrintStuff(null, null, null)).CheckAssertions();
解决方案应该支持自动更改断言。
最佳答案
如果 PrintStuff
位于接口(interface)中,但您的断言位于具体类中,谁能说相同的断言适用于所有实现?听起来您真正想要的是为接口(interface)而不是具体类提供契约。显然你不能在“普通”C# 代码中做到这一点...
现在,我建议使用 Code Contracts支持契约继承,包括接口(interface)。如果您使用的是 Visual Studio Premium 或 Ultimate 版本,您可以进行编译时静态检查,确保您没有违反断言。否则,我相信你又会开始 mock 。现在,如果您使用模拟,我认为契约(Contract)不会自动被选择,因为它们通常使用二进制重写来应用......但我预计该领域的工具很快就会得到改进。当然,模拟通常涉及指定您期望的输入,因此您应该能够在编写测试时确保它们是有效的。
您可能还想查看Pex它会探索您的代码并尝试为您破解它。
关于c# - 断言(契约)和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926959/