繁体   English   中英

单元测试接口的实现,该怎么做?

[英]Unit testing interface implementations, how to do it?

如何在(抽象)类中测试接口方法实现的行为,而不必将测试复制到每个类?

我有实现多个接口的(抽象)类。 我知道每个接口的行为方式,并在测试方法中对此进行了定义,因此不必为接口的每个实现手动重复这些测试。

我可以为每个接口创建一个带有测试的抽象类,并具有一个抽象方法CreateSUT()来创建具体类的新实例。 但是然后我必须为类实现的每个接口使用相同的CreateSUT()实现创建一个新类,因为C#不支持多重继承。 有一个更好的方法吗?

还要注意,我还想测试在具有几个非抽象子类的抽象类中实现的接口,这会使事情稍微复杂化。


这个问题与我是否应该对接口实现进行单元测试无关 意见不一,我决定这样做是因为我知道接口实现的预期行为(绝不返回空值,返回只读集合等)并将这些测试放在一起使我更容易测试它们的实现,尽管可能有很多。

您可以创建一个列表来保存接口的所有具体实现的实例,然后遍历该列表中的每个元素并在测试中声明不变式。

根据您的测试框架,应该有一种方法可以在测试失败时获得可操作的反馈。

快速搜索为我找到了nUnit: http ://www.nunit.org/index.php?p = testCaseSource&r = 2.5.9

好吧,我不明白为什么需要这样做,但是您可以为接口编写带有测试的静态帮助器类。 例如

public static class IFooTests
{
    public static void ShouldDoSomething(this IFoo foo)
    {
        // Assert something
    }
}

稍后,对于实现IFoo接口的每个对象,您可以快速创建测试方法:

[Test]
public void ShouldDoSomething()
{
    Bar bar = new Bar(); // create and setup your concrete object
    bar.ShouldDoSomething(); // call interface test extension
}

您可以使用moq模拟抽象类,或者创建一个实现所有接口的接口,然后让抽象类实现您新创建的接口,然后模拟新接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM