CreateMany与种子有什么关系?

时间:2015-02-11 19:32:54

标签: c# unit-testing autofixture

CreateMany参数的T seed重载实际上做了什么?我试图播种,但种子似乎对创建的对象没有影响。例如,我期待如果我的种子具有string类型的属性,那么:

  • 字符串值将用于在所有新创建的对象中填充该属性

  • 或在所有新创建的对象中设置该属性时,字符串值将用作前缀

1 个答案:

答案 0 :(得分:14)

TL;博士

作为一般规则,AutoFixture does not guarantee如何在创建过程中使用种子值(如果有的话)。这一特征源于AutoFixture is designed的方式。

背景

每次要求AutoFixture创建某个Type的对象时,请求都会通过a pipeline of objects called "builders"进行路由。每个构建器负责处理某种请求(无论是对具体类型接口的请求)属性字段等)。如果构建器遇到它可以处理的请求,它将为它返回一个值,并且管道将在下一个请求时重新启动。

鉴于上述情况,如果您想基于种子创建对象,则所有AutoFixture都可以确保您提供的种子值是embedded in the request,通过管道。然后由构建者决定如何处理该值。

解决方案

AutoFixture目前附带一个单一构建器,它考虑了种子值和the one for strings

但是,您可以通过使用the FromSeed method专门为该类型自定义Fixture来告诉AutoFixture在创建任何类型的对象时应如何使用种子值:

var fixture = new Fixture();
fixture.Customize<Foo>(c =>
    c.FromSeed(seed =>
        {
            // return an instance of Foo
            // that uses the seed value in some way
        }));

每次AutoFixture必须创建FromSeed的实例时,将调用您提供给Foo工厂函数,并且它将从{{传递种子值1}}。例如,鉴于此:

Fixture

工厂函数的fixture.CreateMany<Foo>(seed: new Foo { Bar = "baz" }); 参数将接收seed属性设置为Foo的{​​{1}}种子对象。