加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何仅在列表中的项目的子范围上分配属性?

发布时间:2020-12-15 08:48:52 所属栏目:百科 来源:网络整理
导读:我想使用AutoFixture创建自定义对象列表.我希望前N个对象的属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture的默认策略设置). 我知道我可以使用Fixture.CreateMany T .With,但这会将一个函数应用于列表的所有成员. 在NBuilder中,有一些名为
我想使用AutoFixture创建自定义对象列表.我希望前N个对象的属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture的默认策略设置).

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

在NBuilder中,有一些名为TheFirst和TheNext(以及其他)的方法可以提供此功能.他们使用的一个例子:

鉴于Foo类:

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

可以像这样实例化一堆Foos:

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

(Bar9和Bar10值代表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可能会受益于重新设计.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读