CreateMany与种子有什么关系?

SFu*_*n28 8 c# unit-testing autofixture

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

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

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

Enr*_*lio 14

TL;博士

作为一般规则,AutoFixture 不保证在创建过程中如何使用种子值(如果有的话).这一特征源于AutoFixture 的设计方式.

背景

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

鉴于上述情况,如果您想基于种子创建对象,则所有AutoFixture都可以确保您提供的种子值嵌入在通过管道发送的请求中.然后由建造者决定如何处理该值.

AutoFixture目前附带一个构建器,它考虑了种子值,而且是字符串的值.

但是,通过使用以下方法专门为该类型自定义,可以告诉AutoFixture在创建任何类型的对象时应如何使用种子值:FixtureFromSeed

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

每次AutoFixture必须创建一个实例时,将调用您提供的工厂函数FromSeed,Foo并且它将从中传递种子值Fixture.例如,鉴于此:

fixture.CreateMany<Foo>(seed: new Foo { Bar = "baz" });
Run Code Online (Sandbox Code Playgroud)

seed工厂函数的参数将接收属性设置为的Foo种子对象.Bar"baz"