Настройка автоэкспозиции: предоставить параметр конструктора

У меня есть следующий класс:

class Foo
{
    public Foo(string str, int i, bool b, DateTime d, string str2)
    {
         .....
    }
}

Я создаю Foo с AutoFixture:

var foo = fixture.Create<Foo>();

но я хочу, чтобы AutoFixture предоставила известное значение для параметра str2 и использовала поведение по умолчанию для каждого другого параметра.

Я попробовал реализовать SpecimenBuilder, но я не могу найти способ получить метаданные, связанные с запросом, чтобы узнать, что я вызываюсь из конструктора Foo.

Есть ли способ достичь этого?

Ответы

Ответ 1

Как ответил здесь, вы можете иметь что-то вроде

public class FooArg : ISpecimenBuilder
{
    private readonly string value;

    public FooArg(string value)
    {
        this.value = value;
    }

    public object Create(object request, ISpecimenContext context)
    {
        var pi = request as ParameterInfo;
        if (pi == null)
            return new NoSpecimen(request);

        if (pi.Member.DeclaringType != typeof(Foo) ||
            pi.ParameterType != typeof(string) ||
            pi.Name != "str2")
            return new NoSpecimen(request);

        return value;
    }
}

а затем вы можете зарегистрировать его следующим образом

var fixture = new Fixture();
fixture.Customizations.Add(new FooArg(knownValue));

var sut = fixture.Create<Foo>();