C# Autofixture是否可以枚举所有对象,并为每个属性提供一个可能值列表 我在TDD的中间,可以根据对象的属性过滤对象。过滤规则很多,每个规则通常考虑多个属性

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;} }

我开始检查每一条规则,提供它们被过滤的所有对象属性的枚举,但这很快就变得无趣了,我想在我的大脑被“复制粘贴退化”吞噬之前解决这个问题

AutoFixture在这种情况下应该非常有用,但我在FAQ或备忘单中都找不到相关信息。Ploeh的博客看起来很有希望,但对我来说不够深入

因此,考虑到下面的类

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
}