gpt4 book ai didi

c# - Autofixture 能否在给定每个属性的可能值列表的情况下枚举所有对象

转载 作者:行者123 更新时间:2023-11-30 19:39:54 24 4
gpt4 key购买 nike

我正在对一个可以根据对象的属性过滤对象的业务类进行 TDD。过滤规则很多,每个规则通常考虑多个属性。

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

AutoFixture 应该在这种情况下非常有用,但我在 FAQ 或 CheatSheet 中找不到相关信息。 Ploeh 的博客 populated lists看起来很有前途,但对我来说还不够深入。

所以,给定以下类

public class Possibility
{
public int? aValue {get;set;}
public int? anotherValue {get;set;}
}

我能否获得一个Possibility列表,其中每个类都包含预定义值aValueanotherValue 的一个可能枚举?例如,给定值 [null, 10, 20] for aValue[null, 42] for anotherValue,我将返回 6 个 Possibility 实例。

如果不是,除了自己为每种对象类型编写代码之外,我如何才能获得这种行为?

最佳答案

给出问题的值:

  • null , 10 , 20对于 aValue
  • null , 42 , --对于 anotherValue

这是使用 AutoFixture 执行此操作的一种方法,使用 Generator<T> :

[Fact]
public void CustomizedAutoFixtureTest()
{
var fixture = new Fixture();
fixture.Customizations.Add(
new PossibilityCustomization());

var possibilities =
new Generator<Possibility>(fixture).Take(3);

// 1st iteration
// -------------------
// aValue | null
// anotherValue | null

// 2nd iteration
// -------------------
// aValue | 10
// anotherValue | 42

// 3rd iteration
// -------------------
// aValue | 20
// anotherValue | (Queue is empty, generated by AutoFixture.)
}

内部PossibilityCustomization使用 Queue提供预定义值的类——当它用完预定义值时,它使用 AutoFixture。

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

关于c# - Autofixture 能否在给定每个属性的可能值列表的情况下枚举所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25790631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com