如何在(抽象)类中测试接口方法实现的行为,而不必将测试复制到每个类?
我有(抽象)类实现多个接口。我知道每个接口应该如何表现,我在测试方法中定义它,这样我就不必为接口的每个实现手动重复这些测试。
我可以为每个接口创建一个带有测试的抽象类,并且有一个抽象方法CreateSUT()
,它创建一个具体类的新实例。但是,我必须为类实现的每个接口创建一个具有相同CreateSUT()
实现的新类,因为C#不支持多重继承。有更好的方法吗?
另请注意,我还想测试在具有多个非抽象子类的抽象类中实现的接口,这会使问题稍微复杂化。
这个问题不关于我是否应该对我的接口实现进行单元测试。意见不同,我决定这样做,因为我知道接口实现应该如何表现(永远不会返回空值,返回只读集合等)并将这些测试放在一起使我更容易测试他们的实现,无论有多少。
答案 0 :(得分:0)
好吧,我不明白你为什么需要这个,但是你可以编写带有测试接口的静态助手类。 E.g。
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
}
答案 1 :(得分:0)
您可以创建一个列表来保存接口的所有具体实现的实例,然后遍历该列表中的每个元素并在测试中断言该不变量。
根据您的测试框架,应该有一种方法可以在测试失败时获得可操作的反馈。
快速搜索找到了我的nUnit:http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9
答案 2 :(得分:-1)
您可以使用moq模拟抽象类或创建实现所有接口的接口,然后让抽象类实现新创建的接口,然后模拟新接口。