2014-10-01 15 views
16

Mam następujące klasy:Autofixture modyfikacje: dostarczania parametru konstruktora

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

Tworzę Foo z AutoFixture:

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

ale chcę AutoFixture dostarczenie znanej wartości dla str2 parametr i użyj domyślnego zachowania dla każdego innego parametru.

Próbowałem wdrożyć SpecimenBuilder, ale nie mogę znaleźć sposób, aby uzyskać metadane związane z żądaniem, aby wiedzieć, że jestem wywoływane z konstruktora Foo.

Czy jest jakiś sposób, aby to osiągnąć?

+3

Oto jedna opcja: http://stackoverflow.com/a/16954699/126014 –

+3

Dla kompletności, chcę również zwrócić uwagę na to: http://stackoverflow.com/a/18238876/126014 –

+3

Być może uznasz to za pomocne: http://stackoverflow.com/a/15561752/ 126014 –

Odpowiedz

4

Jak odpowiedział here można mieć coś podobnego

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; 
    } 
} 

a następnie można go zarejestrować się ten

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

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