【发布时间】:2019-02-07 12:47:35
【问题描述】:
我有以下问题。我想测试一个泛型类 MyClass。但是,我并不真正关心用于 T 的类型。 但是,当我在测试中创建 MyClass 的实例时,我需要指定 T 应该是什么。 我可以这样做:
var sut = new MyClass<Object>();
它当然有效,但是,我不喜欢专门放置 Object,因为它向阅读此测试的人暗示,可能 Object 类型在这里很重要。
我喜欢 AutoFixture 使用的方法,其中每个值都是使用 fixture.Create<T>() 创建的,因为它向读者表明该值并不重要。示例:
[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 的确切类型。它可以是任何一个。
【问题讨论】:
-
如果您测试的类是泛型的并且您不需要该泛型,这强烈表明您的类需要进一步分解。为什么你必须指定一个你不需要的泛型!将你的类重构为 2 个类,一个需要泛型,一个不需要
-
您能举例说明
fixture.Create<T>()是如何使用的吗? -
@Alexander 我编辑了我的问题
-
@Liam 不太可能,我的课程实际上是一个配置映射器。它需要 T 来指定配置的类型。我的测试并没有真正测试该类 - 它测试用于注册该类的 AutoFac 模块。
标签: c# unit-testing generics autofixture