2013-08-20 21 views
11

Często używam NSubstitute. I kocham to.Przykład użycia AutoFixture z NSubstitute

Po prostu patrzę na AutoFixture. Wygląda świetnie!

Widziałem AutoFixture for NSubstitute i widziałem kilka przykładów w Moq na temat korzystania z tej funkcji.

Ale nie mogę tego przetłumaczyć na NSubstitute.

Próbowałem to:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization()); 
var addDest = Substitute.For<IPerson>(); 

Zastosowanie:

public interface IPersonEntity 
{  
    int ID { get; set; } 
    string FirstName { get; set;} 
    string LastName { get; set;} 
    DateTime DateOfBirth { get; set; } 
    char Gender { get; set; }  
} 

I uzyskać obiekt, ale żaden z tych właściwości są wypełniane (rodzaj punktu AutoFixture).

Próbowałem również:

var fixture = new Fixture().Customize(new AutoNSubstituteCustomization()); 
var result = fixture.Create<IPersonEntity>(); 

To również dało mi obiektu bez właściwości zaludnionych. (Uwaga, jeśli zrobię powyższe z klasą PersonEntity, to wszystkie właściwości zostaną wypełnione.)

Jestem pewien, że istnieje sposób, aby to zadziałało, ale nie mogę tego znaleźć.

Tak, biorąc pod uwagę mój interfejs IPersonEntity powyżej, czy ktoś wie, jak korzystać z AutoFixture i NSubstitute, aby dać mi zaludniony obiekt IPersonEntity?

Odpowiedz

14

Zamiast dostosowywania instancję Fixture z AutoNSubstituteCustomization można użyć dostosowania poniżej:

var fixture = new Fixture().Customize(
    new AutoPopulatedNSubstitutePropertiesCustomization()); 

var result = fixture.Create<IPersonEntity>(); 
// -> All properties should be populated now. 

The AutoPopulatedNSubstitutePropertiesCustomization jest zdefiniowany jako:

internal class AutoPopulatedNSubstitutePropertiesCustomization 
    : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.ResidueCollectors.Add(
      new Postprocessor(
       new NSubstituteBuilder(
        new MethodInvoker(
         new NSubstituteMethodQuery())), 
       new AutoPropertiesCommand(
        new PropertiesOnlySpecification()))); 
    } 

    private class PropertiesOnlySpecification : IRequestSpecification 
    { 
     public bool IsSatisfiedBy(object request) 
     { 
      return request is PropertyInfo; 
     } 
    } 
} 

Różnica z AutoNSubstituteCustomization jest, że powyższe dostosowywanie to także decorated z instancją Postprocessor do automatycznego ustawiania wartości dla wszystkich właściwości publicznych e żądany typ.

Referencje:

Powyższe rozwiązanie jest inspirowana przez następujących artykułach bloga przez Mark Seemann:

+0

można zrobić to samo dla metod? tj. wartości metody interfejsu powrotnego wygenerowane przez AutoFixture? –

+0

To [można zrobić] (http://nikosbaxevanis.com/blog/2014/02/23/how-to-configure-autofoq-with-foqs-return-strategy/) z [AutoFixture.AutoFoq] (http: //www.nuget.org/packages/AutoFixture.AutoFoq), ale powinno to być wykonalne również za pomocą [AutoFixture.AutoNSubstitute] (https://www.nuget.org/packages/AutoFixture.AutoNSubstitute). –

+0

Ja raczej myślałem o czymś takim jak AutoConfiguredNSubstituteCustomization (odpowiedź w osobnym pytaniu), ale dzięki mimo to. –

Powiązane problemy