如何在具有 where 约束的泛型中使用 NUnit 测试用例?
How to use NUnit TestCases with Generics with where constraint?
我正在尝试按照这个答案将 NUnit 与通用测试用例一起使用:
NUnit TestCase with Generics from @György Kőszeg.
但是,由于我的测试,我需要使用 where
constraint with a complex type passed in (class), otherwise the compiler erros with error CS0314。
[TestCase(typeof(SomeClass))]
[TestCase(typeof(SomeOtherClass))]
public void GenericTest<T>(T instance) where T : ISomeInterface
{
Console.WriteLine(instance);
}
SomeClass
和 SomeOtherClass
有效 类 实现 ISomeInterface
.
这确实失败并出现以下错误:
An exception was thrown while loading the test.
System.ArgumentException: GenericArguments[0], 'System.RuntimeType', on '[...]GenericTestT' violates the constraint of type 'ISomeInterface'.
我无法让它工作。如果我将其更改为 nameof(SomeClass)
以尝试使用字符串值,我会得到相同的错误,即 String
与约束不匹配。
哎呀,当然要从类型上去干涉了
因此,它变得有点困难,因为 TestCases
需要是静态的,但我们可以使用 TestCaseSource
.
[TestCaseSource(nameof(GetTestCases))]
public void GenericTest<T>(T instance) where T : ISomeInterface
{
Console.WriteLine(instance);
}
private static IEnumerable<TestCaseData> GetTestCases()
{
yield return new TestCaseData(new SomeClass());
yield return new TestCaseData(new SomeOtherClass());
}
作为不相关的补充,如果您实际上并不使用它而只是想将其用于以下类型,则可以 discard instance
:
[TestCaseSource(nameof(GetTestCases))]
public void GenericTest<T>(T _) where T : ISomeInterface
{
// ...
}
我正在尝试按照这个答案将 NUnit 与通用测试用例一起使用: NUnit TestCase with Generics from @György Kőszeg.
但是,由于我的测试,我需要使用 where
constraint with a complex type passed in (class), otherwise the compiler erros with error CS0314。
[TestCase(typeof(SomeClass))]
[TestCase(typeof(SomeOtherClass))]
public void GenericTest<T>(T instance) where T : ISomeInterface
{
Console.WriteLine(instance);
}
SomeClass
和 SomeOtherClass
有效 类 实现 ISomeInterface
.
这确实失败并出现以下错误:
An exception was thrown while loading the test. System.ArgumentException: GenericArguments[0], 'System.RuntimeType', on '[...]GenericTestT' violates the constraint of type 'ISomeInterface'.
我无法让它工作。如果我将其更改为 nameof(SomeClass)
以尝试使用字符串值,我会得到相同的错误,即 String
与约束不匹配。
哎呀,当然要从类型上去干涉了
因此,它变得有点困难,因为 TestCases
需要是静态的,但我们可以使用 TestCaseSource
.
[TestCaseSource(nameof(GetTestCases))]
public void GenericTest<T>(T instance) where T : ISomeInterface
{
Console.WriteLine(instance);
}
private static IEnumerable<TestCaseData> GetTestCases()
{
yield return new TestCaseData(new SomeClass());
yield return new TestCaseData(new SomeOtherClass());
}
作为不相关的补充,如果您实际上并不使用它而只是想将其用于以下类型,则可以 discard instance
:
[TestCaseSource(nameof(GetTestCases))]
public void GenericTest<T>(T _) where T : ISomeInterface
{
// ...
}