Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NUnit 3动态值源属性_C#_Nunit_Nunit 3.0 - Fatal编程技术网

C# NUnit 3动态值源属性

C# NUnit 3动态值源属性,c#,nunit,nunit-3.0,C#,Nunit,Nunit 3.0,我必须将NUnit 2.x测试转换为NUnit 3.x测试,目前的情况是,ValueSource中为这些测试使用了一个带有测试和抽象IEnumerable属性的基类,以及许多继承此基类并重写此属性的类。 问题是如何将这些测试转换为NUnit 3.x,其中ValueSource必须是静态的。每个基本子级还具有不同的TestCategory.Subcategory 在我看来,唯一的办法就是从抽象类中删除抽象属性定义,并在每个子类中定义这个属性,但这听起来很糟糕。有更好的办法吗 编辑:有时,子类中还有

我必须将NUnit 2.x测试转换为NUnit 3.x测试,目前的情况是,ValueSource中为这些测试使用了一个带有测试和抽象IEnumerable属性的基类,以及许多继承此基类并重写此属性的类。 问题是如何将这些测试转换为NUnit 3.x,其中ValueSource必须是静态的。每个基本子级还具有不同的TestCategory.Subcategory

在我看来,唯一的办法就是从抽象类中删除抽象属性定义,并在每个子类中定义这个属性,但这听起来很糟糕。有更好的办法吗


编辑:有时,子类中还有一些其他测试,因此这些类并不总是仅用于数据填充。

基类必须是抽象的,否则它将实例化它并运行它包含的测试。当然,当它实例化基类时,它还会重新运行相同的测试。这在最好的情况下是令人困惑的,在最坏的情况下,当测试仅在基类上运行时会出现错误

你在问题中使用了“动态”一词,没有解释。如果您所指的是实例方法或属性,那么这个答案适合您。当然,与静态方法相反的是C语言中的实例方法,而动态方法则是另一回事。在任何情况下,如果你的意思是其他的,请编辑你的问题来解释

所以。。。虽然NUnit3要求源代码是静态的,但这并不限制您只使用编译时已知的东西。如果您的源是一个静态方法而不是一个字段,那么您就有可能发现必要的信息,以便在某种意义上动态地生成数据


在NUnit3中,也可以使用TestCaseSource来包含数据。在这种情况下,属性构造函数的表单3(参见文档)确实允许使用实例成员。但是,此表单将您的数据与测试放在一个单独的类中,可能不适合您的使用。

我的问题是如何处理TestDataSource,因为它现在必须是静态的。我可以在每个子类中创建相同的静态属性,但它缺少抽象+重写的必要绑定,因为静态不能是抽象的。这不是一个好的设计,所以必须有更好的方法,我可以做到这一点。我也不确定在基本抽象类中使用静态属性是否合适,因为它随后会为所有子类共享—为所有测试共享。你能告诉我正确的方向吗?正如文档所示,TestCaseSource的表单3使用即时成员。但是,这需要是一个带有默认构造函数的类,完全独立于测试层次结构,因此我可以看出它不适合您。NUnit本身也有类似的测试,它只是在每个派生类中分别定义源。例如,请参见其中EqualConstraintSet从ConstraintTestBase派生。我找不到更好的方法来做这件事。
[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 */ }
    }
}