【问题标题】:What does CreateMany with seed do?CreateMany 与种子有什么作用?
【发布时间】:2015-04-12 07:56:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# unit-testing autofixture


    【解决方案1】:

    tl;博士

    作为一般规则,AutoFixture does not guarantee 在创建过程中将如何使用种子值(如果有的话)。这个特点源于AutoFixtureis 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
            }));
    

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

    fixture.CreateMany<Foo>(seed: new Foo { Bar = "baz" });
    

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

    【讨论】:

    猜你喜欢
    • 2023-02-16
    • 2021-11-10
    • 2016-07-18
    • 1970-01-01
    • 2021-08-21
    • 2011-01-21
    • 2018-03-27
    • 2011-02-25
    • 2010-12-20
    相关资源
    最近更新 更多