xUnit - 在测试中提取和实现接口

xUnit - Extracting and Implementing Interfaces on Tests

上下文

我刚刚遇到一个场景,我有多个 UnitTests 足够相似,几乎可以用 ctrl-c ctrl-v 方式处理。例如,当断言 AutoMapper 及其 Profiles 有效时。

问题

所以我一直在想 从这些测试中提取接口并在我需要测试属于同样的目的.

代码片段

例如,对于以下测试:

[Fact]
public void ConfigurationValid()
{
    throw new System.NotImplementedException();
}

[Fact]
public void FromCreate()
{
    throw new System.NotImplementedException();
}

[Fact]
public void FromEdit()
{
    throw new System.NotImplementedException();
}

[Fact]
public void ToDetail()
{
    throw new System.NotImplementedException();
}

[Fact]
public void ToList()
{
    throw new System.NotImplementedException();
}

[Fact]
public void ToList_Many()
{
    throw new System.NotImplementedException();
}

可以提取到如下界面:

public interface IViewModelsTests
{
    void ConfigurationValid();
    void FromCreate();
    void FromEdit();
    void ToDetail();
    void ToList();
    void ToList_Many();
}

每当我创建一个新的 ViewModel 并希望对其进行单元测试时,我只需在我的新 TestClass 上实现该接口并让它覆盖所有默认场景。而且我仍然可以在需要时灵活地添加新测试以涵盖每个 ViewModel 的非常具体的场景。

如果它们足够相似,那么从基础 class 到 运行 这些测试中派生出来就不会很糟糕了。然后将功能编写一次并添加到所有实现中。

注意不要让它们太复杂,或者有多层继承。这可能会导致非常难读的测试和不可维护的代码。