AutoFixture CompositeDataAttribute不适用于PropertyDataAttribute

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

Nik*_*nis 3

实际发生了什么

\n\n

定义NumericSequence [PropertyData]两个迭代。

\n\n

with的组成假设每次迭代都有足够的数据NumericSequence [PropertyData][AutoData]

\n\n

然而,实际的组成是:

\n\n
1st iteration:  [PropertyData], [AutoData]\n\n2nd iteration:  [PropertyData], [n/a]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是为什么在第二次迭代中您最终会耗尽数据。

\n\n

作品

\n\n

从某种意义上说,它CompositeDataAttribute尊重LSP ,因为它是根据所有数据理论的基础DataAttribute(即类)进行编程的。

\n\n

(也就是说,不假设所有属性[AutoData]最后都由 组成。)

\n\n

因此,它不能简单地从第二次迭代跳转到第一次迭代并获取一些[AutoData]会破坏 LSP 的值 xe2x80x93。

\n\n

你可以做什么

\n\n

使实际的组合看起来像:

\n\n
1st iteration:  [PropertyData], [AutoData]\n\n2nd iteration:  [PropertyData], [AutoData]\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过定义两个属性:

\n\n
public static IEnumerable<object[]> FirstPropertyData { get { \n    yield return new object[] { 1 }; } }\n\npublic static IEnumerable<object[]> OtherPropertyData { get { \n    yield return new object[] { 9 }; } }\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该测试执行两次,并且始终由whilen1提供,并且始终由 提供。[PropertyData]n2n3[AutoData]

\n