C# Autofixture是否可以枚举所有对象,并为每个属性提供一个可能值列表 我在TDD的中间,可以根据对象的属性过滤对象。过滤规则很多,每个规则通常考虑多个属性
我开始检查每一条规则,提供它们被过滤的所有对象属性的枚举,但这很快就变得无趣了,我想在我的大脑被“复制粘贴退化”吞噬之前解决这个问题 AutoFixture在这种情况下应该非常有用,但我在FAQ或备忘单中都找不到相关信息。Ploeh的博客看起来很有希望,但对我来说不够深入 因此,考虑到下面的类C# Autofixture是否可以枚举所有对象,并为每个属性提供一个可能值列表 我在TDD的中间,可以根据对象的属性过滤对象。过滤规则很多,每个规则通常考虑多个属性,c#,tdd,autofixture,C#,Tdd,Autofixture,我开始检查每一条规则,提供它们被过滤的所有对象属性的枚举,但这很快就变得无趣了,我想在我的大脑被“复制粘贴退化”吞噬之前解决这个问题 AutoFixture在这种情况下应该非常有用,但我在FAQ或备忘单中都找不到相关信息。Ploeh的博客看起来很有希望,但对我来说不够深入 因此,考虑到下面的类 public class Possibility { public int? aValue {get;set;} public int? anotherValue {get;set;} }
public class Possibility
{
public int? aValue {get;set;}
public int? anotherValue {get;set;}
}
我可以得到一个可能性
列表,其中每个类都包含一个预定义值的可能枚举aValue
和另一个值
?例如,给定aValue
的[null,10,20]
值和另一个值的[null,42]
,我将返回6个可能性的实例
如果不是,除了为每种对象类型自己编码外,我如何获得这种行为?给定问题中的值:
null
,10
,20
用于aValue
null
,42
,--
用于另一个值
以下是使用AutoFixture执行此操作的一种方法:
AutoFixture会生成,因此,当您已经有了要合并的精确值时,它可能不是适合该作业的正确工具
如果您使用NUnit,您可以改为:
[Test]
public void HowToGetPermutations(
[Values(null, 10, 20)] int? aValue,
[Values(null, 42)] int? anotherValue)
{
// Test and assert
}
这将运行此测试方法六次-每个可能的排列一次
这是我希望xUnit.net拥有的为数不多的功能之一,但它没有。可能会有3个实例
。我更多考虑的是一个枚举,比如在couples->null,null | null,42 | 10,null | 10,42 |。。。但是我想我看到了如何修改您建议的生成器
来做到这一点您也可以做到–您必须修改可能性定制的内部队列
,然后在生成器实例中将Take(3)
替换为Take(6)
。整洁!我想Autofixture知道如何通过基于约定的解析(即[ClassName]自定义
)找到可能性自定义
),但是我如何才能将一个ISpecimenBuilder
注册到多个类中(例如,在继承的情况下)?您必须修改创建
方法。上面的ISpecimenBuilder
查找属性名称。您可以使其更通用–您也可以使其更具体–您还可以同时使用许多ISpecimenBuilder
实例:)啊,好的,它不是特定于可能性
类,使用生成器创建的任何类都将通过其属性的创建调用。谢谢你的澄清。不过你可以让它更具体。我知道NUnit的组合功能,但我从来没有想过用它们逐个测试我的项目。这是个好主意,我想我的恶心感觉就是我不习惯这样做。我会调查的。
private class PossibilityCustomization : ISpecimenBuilder
{
private readonly Queue<int?> aValues =
new Queue<int?>(new int?[] { null, 10, 20 });
private readonly Queue<int?> anotherValues =
new Queue<int?>(new int?[] { null, 42 });
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi != null)
{
if (pi.Name == "aValue" && aValues.Any())
return aValues.Dequeue();
if (pi.Name == "anotherValue" && anotherValues.Any())
return anotherValues.Dequeue();
}
return new NoSpecimen();
}
}
[Test]
public void HowToGetPermutations(
[Values(null, 10, 20)] int? aValue,
[Values(null, 42)] int? anotherValue)
{
// Test and assert
}