AutoFixture RepeatCount

时间:2017-05-02 14:20:09

标签: c# unit-testing autofixture

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

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

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

提前谢谢

2 个答案:

答案 0 :(得分:1)

我不完全确定这是否是您要做的事情,但您不必担心在自定义样本构建器中处理IEnumerable<T>的请求; AutoFixture会IEnumerable<T> T向<{1}}请求多个请求,然后由您的样本构建者处理。

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

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以满足请求。

答案 1 :(得分:0)

  

问题是......有多少?

默认情况下,这是3.您可以在创建新的Fixture实例时更改此参数:

  var fixture = new Fixture { RepeatCount = 4 };