我试图根据这个例子中的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]
提供,n2
和n3
始终由[AutoData]
提供。关于c# - AutoFixture CompositeDataAttribute不适用于PropertyDataAttribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18852608/