NUnit 3 动态 ValueSourceAttribute

NUnit 3 dynamic ValueSourceAttribute

我必须将 NUnit 2.x 测试转换为 NUnit 3.x 测试,目前的情况是有一个基础 class 测试和 abstract IEnumerable 属性 在 ValueSource 中用于这些测试和 许多 class 继承此基础 class 并覆盖此 属性.
问题是如何将这些测试转换为 NUnit 3.x,其中 ValueSource 必须是静态的。每个碱基child也有不同的TestCategory.Subcategory

[Category(TestCategory.Transformations)]
public abstract class Transformations
{
    [Test]
    public void TransformTest([ValueSource("TestDataSource")] TransformTestSource source)
    {
        // some test logic
    }

    protected abstract IEnumerable<TransformTestSource> TestDataSource { get; }
}

[TestFixture]
[Category(TestCategory.Transformations)]
[Category(TestCategory.Subcategory.Example1)]
public class ChildExample1
{
    protected override IEnumerable<TransformTestSource> TestDataSource
    {
        get { /* get data for example from database, or file */ }
    }
}

我认为唯一的方法是从抽象 class 中删除抽象 属性 定义并在每个 child class 中定义此 属性 但它听起来很可怕。有没有更好的方法?

编辑: 有时,child class 中还有一些其他测试,所以那些 class 并不总是只有用于数据填充。

基础 class 必须是抽象的,否则 NUnit 将实例化它并 运行 它包含的测试。当然,当它实例化基础 class 时,它也会重新 运行 相同的测试。这充其量是令人困惑的,最坏的情况是当测试 运行 仅基于 class 时会出错。

您在问题中使用了动态 一词,但没有解释。如果您的意思是 实例 方法或 属性,那么这个答案适合您。当然,与静态方法相反的是 C# 中的实例方法,"dynamic" 是另外一回事。无论如何,如果您确实有其他意思,请编辑您的问题以进行解释。

所以...虽然 NUnit 3 要求您的源代码是静态的,但这并不限制您只能使用编译时已知的东西。如果您的来源是静态 方法 而不是字段,那么您可能会发现生成数据所需的信息(在某种意义上) "dynamically."

在 NUnit 3 中也可以使用 TestCaseSource 来包含您的数据。在这种情况下,属性构造函数的 Form 3(请参阅文档)确实允许使用实例成员。但是,此表单将您的数据与测试分开 class,可能不适合您的使用。