使用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。
据我所知,这是不可能的。 MemberData
的数据要求是static
,因此数据必须从自己的类起源。
public static IEnumerable<object[]> Data()
{
// data goes here
}
[Theory]
[MemberData(nameof(Data))]
public void TestData(string expected, string actual)
{
// assert goes here
}
你在你的答案是正确的。发布此非答案的情况下,它发生火花的想法。
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);
}
这样做(和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
}
}
另一种方式是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
}
}