CreateMany与种子有什么关系?
具有T seed
参数的CreateMany
重载实际上做了什么? 我试图播种,但种子似乎对创建的对象没有影响。 例如,我期待如果我的种子具有string
类型的属性,那么:
-
字符串值将用于在所有新创建的对象中填充该属性
-
或者在所有新创建的对象中设置该属性时,字符串值将用作前缀
TL;博士
作为一般规则,AutoFixture 不保证在创建过程中如何使用种子值(如果有的话)。 这一特征源于AutoFixture 的设计方式 。
背景
每次要求AutoFixture创建某个Type
的对象时,请求都会通过称为“ 构建器 ”的对象管道进行路由。 每个构建器负责处理某种请求 (无论是对具体类型 , 接口 , 属性 , 字段等的请求)。 如果构建器遇到它可以处理的请求,它将为它返回一个值,并且管道将在下一个请求时重新启动。
鉴于上述情况,如果您想基于种子创建对象,则所有AutoFixture都可以确保您提供的种子值嵌入在通过管道发送的请求中。 然后由建造者决定如何处理该值。
解
AutoFixture目前附带一个构建器 ,它考虑了种子值,而这是一个字符串 。
但是,通过使用FromSeed
方法为该类型自定义Fixture
,可以告诉AutoFixture在创建任何类型的对象时应如何使用种子值:
var fixture = new Fixture(); fixture.Customize(c => c.FromSeed(seed => { // return an instance of Foo // that uses the seed value in some way }));
每次AutoFixture必须创建Foo
实例时,您将为FromSeed
提供的工厂函数将被调用,并且它将从Fixture
传递种子值。 例如,鉴于此:
fixture.CreateMany(seed: new Foo { Bar = "baz" });
工厂函数的seed
参数将接收将Bar
属性设置为"baz"
的Foo
种子对象。