Pet*_*ter 6 .net c# unit-testing mocking autofixture
我想使用创建自定义对象列表AutoFixture
.我希望第一个N
对象将属性设置为一个值,剩余部分将其设置为另一个值(或者简单地由Fixture
默认策略设置).
我知道我可以使用Fixture.CreateMany<T>.With
,但这会将一个函数应用于列表的所有成员.
在NBuilder
那里提供了名称TheFirst
和TheNext
(以及其他)提供此功能的方法.他们使用的一个例子:
给出一个类Foo
:
class Foo
{
public string Bar {get; set;}
public int Blub {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
一个人可以Foo
像这样实例化一堆s:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了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
Run Code Online (Sandbox Code Playgroud)
(Bar9
和Bar10
值表示NBuilder
默认命名方案)
是否有"内置"方式来实现此目的AutoFixture
?或者设置一个像这样的夹具的惯用方法?
Mar*_*ann 10
到目前为止,最简单的方法是这样的:
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);
Run Code Online (Sandbox Code Playgroud)
为C#已经内置了为属性赋值的功能,因此AutoFixture的理念是使用已经可用的语言结构,而不是提供一个限制性API,使您无法完成所有想做的事情.
下一个哲学步骤是,如果你经常需要做那样的事情,那么SUT可能会从重新设计中受益.
归档时间: |
|
查看次数: |
1505 次 |
最近记录: |