【问题标题】:xUnit - Extracting and Implementing Interfaces on TestsxUnit - 在测试中提取和实现接口
【发布时间】:2019-09-10 10:51:21
【问题描述】:

上下文

我刚刚遇到了一个场景,我有多个 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 覆盖非常具体的场景。

【问题讨论】:

  • 对于您的特定情况,可以(应该)通过实际行为测试来测试 AutoMapper。

标签: c# unit-testing .net-core xunit xunit.net


【解决方案1】:

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

请注意不要让它们过于复杂,或者有多个继承级别。这可能会导致难以阅读的测试和无法维护的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多