【问题标题】:AutoFixture RepeatCount自动夹具重复计数
【发布时间】:2017-05-03 20:54:46
【问题描述】:

有没有办法从 ISpecimenBuilder 中知道 RepeatCount?我正在为某个参数名称创建一个新的样本生成器。基本上 Create 方法会询问参数名称,以防它是例如“myParamName”,类型为例如"MyParamType" 它将返回一个自定义对象。

这很完美,但是,如果参数类型是 IEnumerable{MyParamType} 我想“CreateMany”。问题是……有多少?

我不能调用 context.Resolve 或 context.CreateMany{MyParamType},原因很简单,它不会按照我需要的方式创建我的对象。示例:如果 MyParamType 是字符串,它不会创建我需要的格式化字符串。这正是我首先创建样本构建器的原因!:) 我也无法为 MyParamType 注册我的新样本构建器,因为我只需要对特定名称的参数值请求进行此自定义。否则,我需要默认行为

提前谢谢你

【问题讨论】:

    标签: c# unit-testing autofixture


    【解决方案1】:

    我不完全确定这是否是您想要做的,但您不必担心在自定义样本生成器中处理对 IEnumerable<T> 的请求; AutoFixture 会将IEnumerable<T>automatically convert 请求转化为T多个请求,然后由您的样本构建器处理。

    例如,假设我们有一个自定义样本生成器,它只为string 的所有请求返回值"foo"

    public class FooBuilder : ISpecimenBuilder
    {
        public object Create(object request, ISpecimenContext context)
        {
            return request.Equals(typeof(string))
                ? (object)"foo"
                : new NoSpecimen();
        }
    }
    

    现在,这个测试通过了:

    [Fact]
    public void Should_return_all_foos_for_a_sequence_of_strings()
    {
        var fixture = new Fixture { RepeatCount = 4 };
        fixture.Customizations.Insert(0, new FooBuilder());
    
        var many = fixture.Create<IEnumerable<string>>();
    
        Assert.Equal(4, many.Count());
        Assert.All(many, i => Assert.Equal("foo", i));
    }
    

    因为 AutoFixture 确保调用 FooBuilder 的次数与满足请求所需的次数一样多。

    【讨论】:

    • 假设您的样本构建器仅在请求是针对字符串类型和名称 fooParam 的参数时才返回 foo。您的夹具将如何管理对字符串和名称 fooParam 的 IEnumerable 类型的参数的请求?我认为它会创建标准字符串,而不是例如“富”。
    • @AdanayMartín 正确。您必须处理对IEnumerable&lt;string&gt; 类型的ParameterInfo 的请求,但那是 AutoFixture 将其解包成对string 的多个请求。如果您真的需要从自定义样本生成器中知道RepeatCount 的值,您可以使用((Fixture)((SpecimenContext)context).Builder).RepeatCount,但如果不先评估它对测试的重要性,我不会走这条路您的建筑商尊重该财产。您只需返回固定数量的样本就可以了。
    • 非常感谢您的回答。你说的对。属性本身并不重要,因为我可以返回随机数量的元素。我只是在探索 AutoFixture 的可能性,有时我想知道我是否遗漏了什么。
    【解决方案2】:

    问题是……有多少?

    默认为 3。创建新的Fixture 实例时可以更改此参数:

      var fixture = new Fixture { RepeatCount = 4 };
    

    【讨论】:

    • 嗯,这不是真正的答案。我需要从我的样本构建器的 Create 方法中知道这个值,以便我自己创建一个 RepeatCount 自定义对象的列表。
    猜你喜欢
    • 2012-02-26
    • 2017-04-10
    • 2015-09-25
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多