【问题标题】:How do I assign a property on only a subrange of items in a list?如何仅在列表中的项目子范围内分配属性?
【发布时间】:2013-10-10 03:17:25
【问题描述】:

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

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

NBuilder 中有名为TheFirstTheNext(以及其他)的方法提供此功能。它们的使用示例:

给定一个班级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

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

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

【问题讨论】:

  • Foo 类是什么样的?
  • @MarkSeemann 我已经使用Foo 扩展了示例,使其更加清晰。如果您指的是我的实际项目中Foo 是代理的实际类,则大致相同:只是一个带有gettable/settable stringintDateTime 字段的POCO。

标签: c# .net unit-testing mocking autofixture


【解决方案1】:

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

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 可能会从重新设计中受益。

【讨论】:

  • 是的,这就是我最终使用的策略。我从您链接上的讨论中意识到,这个用例与 AutoFixture 的核心意图背道而驰。我刚刚习惯了 NBuilder 美味的语法糖......我怀疑如果我真的想要我的代码有那种“流利”的感觉,我可以在 IEnumerable&lt;T&gt; 之上实现自己的糖。
  • 简洁的解决方案。恕我直言,我仍然认为如果这是内置的会很好。
猜你喜欢
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多