【问题标题】:How to use NUnit TestCases with Generics with where constraint?如何使用带有泛型约束的 NUnit 测试用例?
【发布时间】:2021-03-26 19:04:29
【问题描述】:

我正在尝试按照此答案将 NUnit 与 Generic TestCase 一起使用: NUnit TestCase with Generics 来自@György Kőszeg

但是,由于我的测试,我需要使用带有复杂类型的where constraint(类),否则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 的有效类。

这确实会失败并出现以下错误:

加载测试时引发异常。 System.ArgumentException: GenericArguments[0], 'System.RuntimeType', on '[...]GenericTestT' 违反了类型 'ISomeInterface' 的约束。

我无法让它工作。如果我将其更改为 nameof(SomeClass) 以尝试使用字符串值,我会得到与 String 不匹配约束相同的错误。

【问题讨论】:

    标签: c# unit-testing generics nunit testcase


    【解决方案1】:

    哦,天哪,当然它必须从类型中干扰它。

    因此,它变得有点困难,因为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
    {
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 2017-01-27
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多