Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要泛型类型时的单元测试_C#_Unit Testing_Generics_Autofixture - Fatal编程技术网

C# 需要泛型类型时的单元测试

C# 需要泛型类型时的单元测试,c#,unit-testing,generics,autofixture,C#,Unit Testing,Generics,Autofixture,我有以下问题。我想测试一个泛型类MyClass可能您可以定义一个基类型,比如说IBase,其中所有的T类型都实现了IBase(Class1,其中T:IBase),然后您可以说var sut=new MyClass()可能您可以定义一个基本类型,比如说IBase,其中所有的T类型都实现了IBase(Class1,其中T:IBase),然后您可以说var sut=new MyClass()当前AutoFixture不支持非闭合泛型类型激活,并且不太可能有一天会更改 首先,这是因为C#语言本身支持非封

我有以下问题。我想测试一个泛型类MyClass可能您可以定义一个基类型,比如说
IBase
,其中所有的T类型都实现了IBase(
Class1,其中T:IBase
),然后您可以说
var sut=new MyClass()

可能您可以定义一个基本类型,比如说
IBase
,其中所有的T类型都实现了IBase(
Class1,其中T:IBase
),然后您可以说
var sut=new MyClass()

当前AutoFixture不支持非闭合泛型类型激活,并且不太可能有一天会更改

首先,这是因为C#语言本身支持非封闭泛型类型,仅用于反射目的。如果不在特定的
T
上关闭类型,则不能声明
MyClass
类型的变量。因此,即使AutoFixture为您替换类型并激活实例,也很难处理结果-您需要使用
object
类型的变量,或者依赖于您的类型是否支持该类型。这些选项看起来都不可用


其次,任务本身非常困难,因为泛型类型可能有约束。有时约束可能会变得疯狂,例如具有循环依赖关系:
class MyClass where T1:T2 where T2:IEnumerable
AutoFixture.Idioms
库已经尝试为
GuardClauseAssertion
解决这个问题,但是成功了。此功能需要动态类型生成(顺便说一句,并非所有平台都支持此功能)和非常高级的
反射.Emit
API使用,这使得它很难正确实现。

当前AutoFixture不支持非封闭泛型类型激活,而且不太可能有一天会更改

首先,这是因为C#语言本身支持非封闭泛型类型,仅用于反射目的。如果不在特定的
T
上关闭类型,则不能声明
MyClass
类型的变量。因此,即使AutoFixture为您替换类型并激活实例,也很难处理结果-您需要使用
object
类型的变量,或者依赖于您的类型是否支持该类型。这些选项看起来都不可用


其次,任务本身非常困难,因为泛型类型可能有约束。有时约束可能会变得疯狂,例如具有循环依赖关系:
class MyClass where T1:T2 where T2:IEnumerable
AutoFixture.Idioms
库已经尝试为
GuardClauseAssertion
解决这个问题,但是成功了。此功能需要动态类型生成(顺便说一句,并非所有平台都支持此功能)和非常高级的
Reflection.Emit
API使用,这使得正确实现变得非常困难。

如果您测试的类是泛型的,而您不需要该泛型,这就强烈地表明您的类需要进一步分解。为什么你必须指定一个你不需要的泛型!将您的类重构为两个类,一个需要泛型,另一个不需要。您可以提供一个如何使用
fixture.Create()
的示例吗?@Alexander I编辑了我的question@Liam不太可能,我的类实际上是一个配置映射器。它需要指定配置的类型。我的测试并不是真的测试那个类-它测试用于注册那个类的AutoFac模块。如果你测试的是泛型类,而你不需要那个泛型类,这就强烈地表明你的类需要进一步分解。为什么你必须指定一个你不需要的泛型!将您的类重构为两个类,一个需要泛型,另一个不需要。您可以提供一个如何使用
fixture.Create()
的示例吗?@Alexander I编辑了我的question@Liam不太可能,我的类实际上是一个配置映射器。它需要指定配置的类型。我的测试并没有真正测试那个类——它测试用于注册那个类的AutoFac模块。它并没有真正改变任何东西。对象或IBase—它们都是我在测试中必须提到的具体类型。我想要更多的抽象。我想通知测试,我需要一些类型,但我不在乎将使用什么类型。这正是AutoFixture所做的,但它与类型而不是实例相关。它实际上不会改变任何东西。对象或IBase—它们都是我在测试中必须提到的具体类型。我想要更多的抽象。我想通知测试,我需要一些类型,但我不在乎将使用什么类型。这正是AutoFixture所做的,但它与类型而不是实例相关。感谢您的有趣帖子。学习新事物总是很好的,这是一篇有趣的文章。学习新东西总是好的
var sut = new MyClass<Object>();
[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);
}