And*_*vko 7 c# xunit.net autofixture
我正在尝试AutoPropertyDataAttribute基于CompositeDataAttribute此示例创建AutoFixture:PropertyData和异构参数.
它适用于单组参数,但失败并带有更多参数集.这是代码:
public static IEnumerable<object[]> NumericSequence
{
get
{
yield return new object[] {1};
//yield return new object[] {2};
}
}
[Theory]
[AutoPropertyData("NumericSequence")]
public void Test(int? p1, int? p2, int? p3)
{
Assert.NotNull(p1);
Assert.NotNull(p2);
}
public class AutoPropertyDataAttribute : CompositeDataAttribute
{
public AutoPropertyDataAttribute(string propertyName)
: base(
new DataAttribute[] {
new PropertyDataAttribute(propertyName),
new AutoDataAttribute()
})
{
}
}
Run Code Online (Sandbox Code Playgroud)
尝试取消注释第二个yield将使用消息中断测试:
System.InvalidOperationException: Expected 2 parameters, got 1 parameters
at Ploeh.AutoFixture.Xunit.CompositeDataAttribute.<GetData>d__0.MoveNext()
at Xunit.Extensions.TheoryAttribute.<GetData>d__7.MoveNext()
at Xunit.Extensions.TheoryAttribute.EnumerateTestCommands(IMethodInfo method)
Run Code Online (Sandbox Code Playgroud)
同样如此 ClassDataAttribute
实际发生了什么
\n\n定义NumericSequence [PropertyData]了两个迭代。
with的组成假设每次迭代都有足够的数据NumericSequence [PropertyData][AutoData]。
然而,实际的组成是:
\n\n1st iteration: [PropertyData], [AutoData]\n\n2nd iteration: [PropertyData], [n/a]\nRun Code Online (Sandbox Code Playgroud)\n\n这就是为什么在第二次迭代中您最终会耗尽数据。
\n\n作品
\n\n从某种意义上说,它CompositeDataAttribute尊重LSP ,因为它是根据所有数据理论的基础DataAttribute(即类)进行编程的。
(也就是说,不假设所有属性[AutoData]最后都由 组成。)
因此,它不能简单地从第二次迭代跳转到第一次迭代并获取一些[AutoData]会破坏 LSP 的值 xe2x80x93。
你可以做什么
\n\n使实际的组合看起来像:
\n\n1st iteration: [PropertyData], [AutoData]\n\n2nd iteration: [PropertyData], [AutoData]\nRun Code Online (Sandbox Code Playgroud)\n\n通过定义两个属性:
\n\npublic static IEnumerable<object[]> FirstPropertyData { get { \n yield return new object[] { 1 }; } }\n\npublic static IEnumerable<object[]> OtherPropertyData { get { \n yield return new object[] { 9 }; } }\nRun Code Online (Sandbox Code Playgroud)\n\n那么,原来的测试可以写成:
\n\n[Theory]\n[AutoPropertyData("FirstPropertyData")]\n[AutoPropertyData("OtherPropertyData")]\npublic void Test(int n1, int n2, int n3)\n{\n}\nRun Code Online (Sandbox Code Playgroud)\n\n该测试执行两次,并且始终由whilen1提供,并且始终由 提供。[PropertyData]n2n3[AutoData]