没有泛型的测试类简化

问题描述 投票:3回答:2

我有一大堆模型,它们都实现了IEquatable<T>,除了SUT类型之外,我有几个类似的外观测试类。测试验证了所测试模型所实现的实现和一些其他常见方面。

使用抽象通用测试类并没有太大成效,我在运算符上放松了编译时的重载决策,我必须为每种类型实现派生测试类。

使用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()},
    /* ... */
}

有没有人知道一种方法,它允许我维护一个对象集合并使用编译时重载决策进行测试?

c# xunit autofixture automoq
2个回答
1
投票

你可以像这样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基类。


1
投票

首先,拥有一个用于测试不同行为的静态集合就是一种自杀。不要自己开枪。其次,除了现在具有am属性赋予你运行反射能力的事实之外,目前还不太清楚你想要实现什么。如果你的问题是关于与泛型一起反思,那么它确实是可能的。看看typeof(GenericType<>).MakeGenericType(...)之类的东西。

© www.soinside.com 2019 - 2024. All rights reserved.