【问题标题】:Unit testing interface implementations, how to do it?单元测试接口实现,怎么做?
【发布时间】:2012-03-22 22:06:27
【问题描述】:

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

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

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

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


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

【问题讨论】:

  • 那么有三个选项 1. 不要测试接口 - 你拒绝了。 2. 测试每个派生类。 3. 只测试一个派生类。
  • 我不太明白你在“我可以创造......”段落中所说的内容。您不必在接口中包含工厂方法。我也不明白为什么你会遇到“缺乏多重继承”的问题。您仍然可以让一个类实现多个接口,这似乎就是您的情况。

标签: c# unit-testing interface


【解决方案1】:

好吧,我不明白你为什么需要这个,但你可以编写静态帮助类并为你的接口进行测试。例如

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
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 您能指出与回答我的问题相关的内容吗?
      • 不应使用模拟来测试接口的实现的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2015-03-24
      • 2011-01-28
      相关资源
      最近更新 更多