代码之家  ›  专栏  ›  技术社区  ›  Egor Pavlikhin

断言(合同)和单元测试

  •  2
  • Egor Pavlikhin  · 技术社区  · 14 年前

    说我有办法

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

    我还有另外一种方法 AnotherMethod() 哪个在叫 PrintStuff() . 让我们假设 打印程序() 在某些接口中定义 另一种方法() 正在使用。问题是:编写单元测试时 另一种方法() 我怎么能 自动化 测试 另一种方法() 不将任何值传递到 打印程序() 这违反了它的断言?

    类似:

    printer.Expect(x => x.PrintStuff(null, null, null)).CheckAssertions();
    

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

    1 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    如果 PrintStuff 是在一个接口中,但您的断言是在一个具体的类中,谁说相同的断言适用于所有实现?听起来你真正想要的是 界面 而不是具体的等级。显然,在“普通”C代码中不能这样做…

    现在,我建议使用 Code Contracts 支持契约继承,包括接口。如果您使用的是Visual Studio高级版或终极版,则可以 编译时间 静态检查您是否不违反断言。否则,你又开始嘲笑我了。现在,如果你使用mocking,我不认为合同会自动获得,因为它们通常是使用二进制重写应用的…但我希望这一领域的工具能够很快得到合理的改进。当然,模拟通常需要指定您希望的输入,因此您应该能够确保在编写测试时它们是有效的。

    你也可以看看 Pex 它探索你的代码并试图为你破解它。