Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试接口实现,如何做?_C#_Unit Testing_Interface - Fatal编程技术网

C# 单元测试接口实现,如何做?

C# 单元测试接口实现,如何做?,c#,unit-testing,interface,C#,Unit Testing,Interface,如何测试(抽象)类中接口方法实现的行为,而不必将测试复制到每个类? 我有实现多个接口的(抽象)类。我知道每个接口应该如何工作,我在测试方法中定义了这一点,这样我就不必为接口的每个实现手动重复这些测试 我可以为每个接口创建一个带有测试的抽象类,并有一个抽象方法CreateSUT(),该方法创建一个具体类的新实例。但是,我必须为类实现的每个接口创建一个具有相同CreateSUT()实现的新类,因为C不支持多重继承。有更好的方法吗 还要注意的是,我还想测试在抽象类中实现的接口,这些抽象类有几个非抽象子

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

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

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

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



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

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

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

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
}

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

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


通过快速搜索,我找到了nUnit:

有三种选择1。不要测试接口-您拒绝了。2.测试每个派生类。3.只测试一个派生类。我不太理解你在“我可以创建…”一段中说的话。您不必在接口中包含工厂方法。我也不明白为什么你会遇到“缺乏多重继承”的问题。您仍然可以让一个类实现多个接口,这似乎就是你的案例所涉及的。可能相关:你能指出与回答我的问题相关的部分吗?模拟不应该用来测试接口实现的行为。很好的评论为什么,而不仅仅是一个让你的评论更有用的陈述呢。