单元测试接口实现,如何做到这一点

本文关键字:何做 这一点 接口 实现 单元测试 | 更新日期: 2023-09-27 18:28:48

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

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

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

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


这个问题是关于是否应该对接口实现进行单元测试的而不是。意见不同,我决定这么做是因为我知道接口实现的行为(从不返回null值、返回只读集合等),并且将这些测试放在一起可以让我更容易地测试它们的实现,无论它们有多少。

单元测试接口实现,如何做到这一点

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

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
}

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

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

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

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

相关文章: