gpt4 book ai didi

c# - 如何仅对列表中的一部分项目分配属性?

转载 作者:太空狗 更新时间:2023-10-29 21:13:09 25 4
gpt4 key购买 nike

我想使用 AutoFixture 创建自定义对象列表.我要第一个N对象将一个属性设置为一个值,其余的将其设置为另一个值(或简单地由 Fixture 的默认策略设置)。

我知道我可以使用 Fixture.CreateMany<T>.With ,但这会将函数应用于列表的所有成员。

NBuilder有名为 TheFirst 的方法和 TheNext (除其他外)提供此功能。它们的使用示例:

给定一个类 Foo :

class Foo
{
public string Bar {get; set;}
public int Blub {get; set;}
}

一个人可以实例化一堆Foo就像这样:

class TestSomethingUsingFoo
{
/// ... set up etc.

[Test]
public static void TestTheFooUser()
{
var foosToSupplyToTheSUT = Builder<Foo>.CreateListOfSize(10)
.TheFirst(5)
.With(foo => foo.Bar = "Baz")
.TheNext(3)
.With(foo => foo.Bar = "Qux")
.All()
.With(foo => foo.Blub = 11)
.Build();

/// ... perform the test on the SUT
}
}

这给出了类型为 Foo 的对象列表具有以下属性:

[Object]    Foo.Bar    Foo.Blub
--------------------------------
0 Baz 10
1 Baz 10
2 Baz 10
3 Baz 10
4 Baz 10
5 Qux 10
6 Qux 10
7 Qux 10
8 Bar9 10
9 Bar10 10

(Bar9Bar10 值表示 NBuilder 的默认命名方案)

是否有使用 AutoFixture 实现此目的的“内置”方法? ?还是一种惯用的方式来设置夹具以表现得像这样?

最佳答案

到目前为止,最简单的方法是这样的:

var foos = fixture.CreateMany<Foo>(10).ToList();
foos.Take(5).ToList().ForEach(f => f.Bar = "Baz");
foos.Skip(5).Take(3).ToList().ForEach(f => f.Bar = "Qux");
foos.ForEach(f => f.Blub = 11);

为属性赋值已经内置于 C# 中,因此与其提供限制性 API 可能无法让您做您想做的一切,the AutoFixture philosophy is to use the language constructs already available .

下一个哲学步骤是,如果您经常需要做这样的事情,SUT可能会受益于重新设计。

关于c# - 如何仅对列表中的一部分项目分配属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19286476/

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