2017-05-24 50 views
3

使用xUnit.net,Theory有可能使MemberData来自派生类?xUnit.net理论其中MemberData来自派生类

public abstract class BaseTest 
{ 
    public abstract IEnumerable<object[]> Data(); 

    [Theory] 
    [MemberData(nameof(Data))] 
    public void TestData(string expected, string actual) 
    { 
     // assert goes here 
    } 
} 

public class ComplexTest : BaseTest 
{ 
    public override IEnumerable<object[]> Data() 
    { 
     // data goes here 
    } 
} 

上述结果在下面的错误消息的代码:不支持指定的方法:

System.NotSupportedException。

回答

3

据我所知,这是不可能的。 MemberData的数据必须是static,因此数据必须来自其自己的类。

public static IEnumerable<object[]> Data() 
{ 
    // data goes here 
} 

[Theory] 
[MemberData(nameof(Data))] 
public void TestData(string expected, string actual) 
{ 
    // assert goes here 
} 
1

你在答案中是正确的。发布这个不回答的情况下,它碰巧引发一个想法。

MemberData可以通过参数,这可能会帮助根据您的具体情况?

除此之外,你可以习题做的最好的是把一个转发器:

public abstract class BaseTest 
{ 
    protected void RunTest(string expected, string actual) 
    { 
     Assert.Equal(expected, actual); 
    } 
} 

public class ComplexTest : BaseTest 
{ 
    static IEnumerable<object[]> Data() = 
    { 
     { "a", "a" } 
    } 

    [Theory, MemberData(nameof(Data))] 
    void TestData(expected, actual) => base.RunTest(expected, actual); 
} 
1

这样做(和IMO清洁剂)的另一种方法,是把你的测试场景在自己特定的类和只需将每个场景集定义为单独的MemberData属性:

public class BaseTest 
{ 
    [Theory] 
    [MemberData(nameof(TestScenarios1.Data), MemberType = typeof(TestScenarios1)] 
    [MemberData(nameof(TestScenarios1.MoreData), MemberType = typeof(TestScenarios1)] 
    [MemberData(nameof(TestScenarios2.DifferentData), MemberType = typeof(TestScenarios2)] 
    public void TestData(string expected, string actual) 
    { 
     // assert goes here 
    } 
} 

public class TestScenarios1 
{ 
    public static IEnumerable<object[]> Data() 
    { 
     // data goes here 
    } 

    public static IEnumerable<object[]> MoreData() 
    { 
     // data goes here 
    } 
} 

public class TestScenarios2 
{ 
    public static IEnumerable<object[]> DifferentData() 
    { 
     // data goes here 
    } 
}