2012-03-22 75 views
1

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

我有(抽象)类实现多个接口。我知道每个接口应该如何表现,我在测试方法中定义了这一点,以便我不必为接口的每个实现手动重复这些测试。

我可以为每个接口创建一个抽象类与测试,并有一个抽象方法CreateSUT()创建具体类的新实例。但是之后我不得不为每个类实现的接口创建一个新的类,因为C#不支持多继承。有一个更好的方法吗?

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


这个问题是不是我是否应该单元测试我的接口实现。意见不同,我决定这样做,因为我知道接口实现应该如何表现(从不返回空值,返回只读集合等),并将这些测试放在一起使我更容易测试他们的实现,但是可能有很多。

+0

那么有三个选项1.不要测试界面 - 你拒绝。 2.测试每个派生类。 3.只测试一个派生类。 – gdoron 2012-03-22 22:09:12

+0

我不太明白你在“我可以创建...”段落中所说的话。您不必在界面中包含工厂方法。我也不明白为什么你遇到了“缺乏多重继承”的问题。你仍然可以有一个类实现几个接口,这似乎是你的情况。 – Tormod 2012-03-22 22:59:09

回答

0

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

+0

你能指出与回答我的问题有关的位吗? – Virtlink 2012-03-22 22:27:53

+0

更新为新内容 – 2012-03-22 22:45:51

0

嗯,我不明白为什么你需要这个,但你可以写你的接口测试的静态助手类。例如。

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 
} 
0

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

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

快速搜索发现我这个对NUnit的:http://www.nunit.org/index.php?p=testCaseSource&r=2.5.9