2014-10-01 3 views
16

У меня есть следующий класс:Autofixture настройки: обеспечивают параметр конструктора

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.

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

+3

Вот один вариант: http://stackoverflow.com/a/16954699/126014 –

+3

Для полноты я также хочу отметить это: http://stackoverflow.com/a/18238876/126014 –

+3

Возможно, вы найдете это также полезным: http://stackoverflow.com/a/15561752/ 126014 –

ответ

4

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

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>(); 
Смежные вопросы