c# - 断言(契约)和单元测试

标签 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() 使用的某些接口(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/

相关文章:

c# - 如何从 C# 访问 SDK?

c# - 在 C# 中转义无效的 XML 字符

unit-testing - 带有 Jasmine 的构造函数中的 spyOn 方法

c# - JSQMessagesViewController 找不到 heightForCellTopLabelAtIndexPath

c# - 使用 WPF 窗体 DataGrid、DataTable 和 Combobox

unit-testing - 如何模拟 Grails Domain 类的特定方法?

unit-testing - 使用模板 golang 进行单元测试

vba - 如何对 VBA 代码进行单元测试? - 两个不同的指针

java - 调用 EasyMock.expect() 时调用通过 EasyMock 和 Powermock 模拟的静态方法

c# - 如何清除 BindingList Comepeltly