CompositeDataAttribute

CompositeDataAttribute

我试图根据这个例子中的AutoPropertyDataAttribute创建CompositeDataAttribute
它可以处理单个参数集,但在处理更多参数集时失败。代码如下:

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()
              })
    {
    }
}

尝试取消注释第二个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)

ClassDataAttribute

最佳答案

实际发生的事情
NumericSequence[PropertyData]定义了两个迭代。
NumericSequence[PropertyData][AutoData]的组合假定每次迭代都有足够的数据。
然而,实际构成是:

1st iteration:  [PropertyData], [AutoData]

2nd iteration:  [PropertyData], [n/a]

这就是为什么在第二次迭代中最终会耗尽数据。
组成
CompositeDataAttribute尊重LSP在某种意义上,它是在所有数据理论的基础上编程的,即DataAttribute类。
(也就是说,没有假设所有属性的末尾都是由[AutoData]组成的。)
因此,它不能简单地从第二次迭代跳到第一次迭代,并获取一些[AutoData]值,这将破坏lsp。
你能做什么
使实际的构图看起来像:
1st iteration:  [PropertyData], [AutoData]

2nd iteration:  [PropertyData], [AutoData]

通过定义两个属性:
public static IEnumerable<object[]> FirstPropertyData { get {
    yield return new object[] { 1 }; } }

public static IEnumerable<object[]> OtherPropertyData { get {
    yield return new object[] { 9 }; } }

然后,原始测试可以写成:
[Theory]
[AutoPropertyData("FirstPropertyData")]
[AutoPropertyData("OtherPropertyData")]
public void Test(int n1, int n2, int n3)
{
}

测试执行两次,n1始终由[PropertyData]提供,n2n3始终由[AutoData]提供。

关于c# - AutoFixture CompositeDataAttribute不适用于PropertyDataAttribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18852608/

10-12 21:30