xUnit.net理论,其中MemberData来自派生类

bud*_*udi 5 c# xunit xunit.net

使用xUnit.net,它是可能的Theory有它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
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码导致以下错误消息:

System.NotSupportedException:不支持指定的方法。

Ayb*_*btu 10

另一种方法(和 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
    }
}
Run Code Online (Sandbox Code Playgroud)


bud*_*udi 5

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

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

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