需要泛型类型时,单元测试

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

我有以下问题。我想测试的通用MyClass类<'T>。不过,我真的不关心被用于T.然而型,当我在测试中创建MyClass的实例,我需要指定什么T被认为是。我能做到这样的:

var sut = new MyClass<Object>();

它的工作原理,当然,不过,我不喜欢把目标明确,因为它表明某人阅读本试验,也许对象类型莫名其妙显著这里。

我喜欢在那里使用fixture.Create<T>()创建的每个值由AutoFixture所使用的方法,因为它显示了读者的价值并不重要。的实施例:

[Fact]
public void IntroductoryTest()
{
    // Arrange
    Fixture fixture = new Fixture();

    int expectedNumber = fixture.Create<int>();
    MyClass sut = fixture.Create<MyClass>();
    // Act
    int result = sut.Echo(expectedNumber);
    // Assert
    Assert.Equal(expectedNumber, result);
}

在上面的代码,我们不关心数量,所以我们使用AutoFixture作为一个事实,即需要一定数量的抽象。

有没有这样的一个解决方案,但对于被类型与泛型类使用?

喜欢的东西:var sut = MyClass<fixture.GenericType>();我这里不关心什么是实际的类型。为了解释我的用例多一点:我有一个用于注册MyClass的AutoFac模块。在我的测试中,我只是想测试一下,如果模块MyClass的正确注册。对于注册时,我不希望指定用于MyClass的一些确切类型。它可以是任何。

c# unit-testing generics autofixture
2个回答
1
投票

目前AutoFixture不支持非封闭泛型类型的激活和它不太可能会改变的一天。

首先它是由C#语言本身支持非封闭式泛型类型仅反射目的的事实引起的。不关闭在特定MyClass<>类型,你不能声明T类型的变量。因此,即使AutoFixture替代型并激活您的实例,这将是很难有结果的工作 - 你要么需要,如果你的类型支持使用object类型的变量或依靠covariance。这些选项都不看起来可用。

其次,任务本身是很难为一般类型可以有约束。有时候,约束会变得疯狂和如有循环依赖:class MyClass<T1, T2> where T1 : T2 where T2 : IEnumerable<T1>。该AutoFixture.Idioms库已经试图解决的GuardClauseAssertion这个问题,但成功is average。此功能需要动态类型代(这BTW是不支持的所有平台)和Reflection.Emit API,这使得它很难正确地贯彻执行的非常高级的用法。


1
投票

也许你可以定义一个基本类型说IBase,所有你的T类型实现广积(Class1<T> where T : IBase),然后你可以说var sut = new MyClass<IBase>();

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