基础 class 中的 NUnit TestCaseSource 以及派生 class 中的数据

NUnit TestCaseSource in base class with data from derived class

我想知道是否有一种方法可以在基础测试 class 中使用 TestCaseSource 以及派生 class 以通用方式给出的数据。

例如,如果我有以下基数 class:

public abstract class Base<T>
{
    protected static T[] Values;

    [TestCaseSource(nameof(Values))]
    public void MyTest(T[] values)
    {
        // Some test here with the values;
    }

}

和下面的派生class

[TestFixture]
public class Derived : Base<string>
{

    [OneTimeSetup]
    public void OneTimeSetup()
    {
        Values = new[] { "One", "Two" };
    }

    [TestCaseSource(nameof(Values))
    public void DerivedSpecificTest(T[] values)
    {
        // Some test here with the values;
    }

}

我认为我所做的是不正确的,因为,当我 运行 派生的 class 测试时,我在两个测试中都得到了这个异常:Failed: System.Exception: The test case source could not be found.

但是,该示例应该涵盖我正在尝试做的事情(如果我正在尝试做的事情是可能的)。本质上我想知道是否可以在基础 class 中使用 TestCaseSource 和派生 class.

给出的数据

感谢任何帮助,如果需要澄清,我可以回答问题。

我还应该提到,如果我将 Values 初始化为一个空的零长度数组,则测试 return 是不确定的。我认为这是因为在创建测试时数据发生了变化(NUnit 的某些行为?)。

如果我不使用 TestCaseSource,我可以得到 运行 的测试,而只是用属性 Test 标记测试,然后将我的测试逻辑插入每个数组值的循环。这并不理想,因为当测试失败时,很难准确地看出是哪个输入导致它失败,因为每个输入都没有分开。

这应该可以帮助您入门,毫无疑问还有更优雅的解决方案。

using System;
using NUnit.Framework;

namespace UnitTestProject1
{
    public class Base<T>
    {
        private static T[] Values;

        [TestCaseSource(nameof(Values))]
        public void MyTest(T value)
        {
            Console.WriteLine($"Base: {value}");
            // Some test here with the values;
        }
    }

    [TestFixture]
    public class Derived : Base<string>
    {
        private static string[] Values= new[] { "One", "Two" };

        [TestCaseSource(nameof(Values))]
        public void DerivedSpecificTest(string value)
        {
            // Some test here with the values;
            Console.WriteLine($"Derived: {value}");
        }
    }
}