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

问题描述 投票:4回答:4

使用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
    }
}

以上在下面的错误信息的结果的代码:

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

c# xunit xunit.net
4个回答
4
投票

据我所知,这是不可能的。 MemberData的数据要求是static,因此数据必须从自己的类起源。

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

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

2
投票

你在你的答案是正确的。发布此非答案的情况下,它发生火花的想法。

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);
}

2
投票

这样做(和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
    }
}

2
投票

另一种方式是MemberData仅添加到派生类。它会按名称查询会员,并采取从当前类正确的。该分析仪警告您必须指定在基类成员的唯一的事(即由视为错误默认值),所以你要禁用该规则。如果您尝试指定这两类这种方法 - 基类和派生只有基类将被使用。有关的xUnit GitHub的描述分析问题:https://github.com/xunit/xunit/issues/1243

你举的例子可以看:

public abstract class BaseTest
{
    [Theory]
#pragma warning disable xUnit1015 // MemberData must reference an existing member
    [MemberData(nameof(Data))]
#pragma warning restore xUnit1015 // MemberData must reference an existing member
    public void TestData(string expected, string actual)
    {
        // assert goes here
    }
}

public class ComplexTest : BaseTest
{
    public static IEnumerable<object[]> Data()
    {
        return data;
        // data goes here
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.