如何在具有 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);
}

SomeClassSomeOtherClass 有效 类 实现 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
{
    // ...
}