c# - 没有泛型的测试类简化

标签 c# xunit autofixture automoq

我有大量模型都实现了 IEquatable<T>除了 SUTs 类型之外,我还有几个外观相似的测试类。这些测试验证了所有由被测模型实现的实现和其他一些常见方面。

使用抽象的通用测试类并没有取得多大的成就,我放弃了对运算符的编译时重载决策,而且无论如何我都必须为每种类型实现一个派生测试类。

使用 MemberData属性有助于消除对派生测试类的需要,但是对运算符的编译时重载分辨率仍然存在。

是否存在另一种方法,例如 InlineData我在哪里维护运算符的编译时重载决策,并有一个对象集合(无论它们是否是类型)来调用测试方法?

在下面的示例中,我使用 MemberData但必须使用反射来调用 ==!=运算符和测试方法签名不太理想,因为它们未被使用(仅使用泛型类型参数)。

[Theory]
[MemberData(nameof(GetModelTypes))]
public void MyTest<T>(T _)
    where T : class, new()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    // Add any known type customization's...

    T t = fixture.Create<T>();
    // Implement remaining generic test body.
}

public static IEnumerable<object[]> GetModelTypes() =>
{
    new object[] {new ModelA()},
    new object[] {new ModelB()},
    /* ... */
}

有谁知道一种方法可以让我维护一个对象集合并使用编译时重载解决方案进行测试?

最佳答案

您可以 write generic unit test classes with xUnit.net像这样:

public abstract class ModelTests<T>
{
    [Fact]
    public void MyTest()
    {
        var fixture = new Fixture();
        var sut = fixture.Create<T>();

        // The rest of the test goes here...
    }

    // More tests go here...
}

public class ModelATests : ModelTests<ModelA> { }
public class ModelBTests : ModelTests<ModelB> { }

也就是说,如果您有大量看起来相似的测试,可能值得研究一下 AutoFixture.Idioms ,尤其是它的 IdiomaticAssertion 基类。

关于c# - 没有泛型的测试类简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963741/

相关文章:

c# - 下拉列表错误

testing - junit报表可视化工具

visual-studio-2015 - Visual Studio 2015 测试资源管理器看不到 XUnit dnx 特征

jenkins - Casperjs 将 XML 导出到 Jenkins

c# - 指定单个构造函数参数值的简单方法?

c# - 以编程方式在 Windows 10/Surface Pro 4 上禁用 Wifi?

c# - 列表包含字典包含列表

c# - 加载常量的 MSIL 指令

c# - 覆盖 Autofixture 自定义设置

entity-framework - 代码中是否有可以代替 fixture.Inject() 的 Autofixture 属性?