2013-08-20 15 views
11

Uso molto NSubstitute. E lo amo.Esempio di come utilizzare AutoFixture con NSubstitute

Sto esaminando l'AutoFixture. Sembra fantastico!

Ho visto AutoFixture for NSubstitute e ho visto alcuni esempi in Moq su come utilizzare questa funzione.

Ma non riesco a tradurlo in NSubstitute.

ho provato questo:

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

Usando:

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

e ottengo un oggetto, ma nessuna delle proprietà sono popolate (sorta di punto di AutoFixture).

Ho anche provato:

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

Questo mi ha anche dato un oggetto con immobili popolate. (Nota se faccio quanto sopra con una classe PersonEntity, allora le proprietà sono tutte popolate.)

Sono sicuro che c'è un modo per farlo funzionare, ma non riesco a trovarlo.

Quindi, data la mia interfaccia IPersonEntity sopra, qualcuno sa come usare AutoFixture e NSubstitute per darmi un oggetto IPersonEntity popolato?

risposta

14

Invece di personalizzare l'istanza Fixture con la AutoNSubstituteCustomization è possibile utilizzare la personalizzazione di seguito:

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

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

Il AutoPopulatedNSubstitutePropertiesCustomization è definito come:

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

La differenza con il AutoNSubstituteCustomization è che quanto sopra la personalizzazione è anche decorated con un'istanza Postprocessor per impostare automaticamente i valori per tutte le proprietà pubbliche di e tipo richiesto

Riferimenti:

La soluzione di cui sopra si ispira ai seguenti articoli del blog per Mark Seemann:

+0

si può fare lo stesso per i metodi? vale a dire i valori del metodo di interfaccia di ritorno generati da AutoFixture? –

+0

È [può essere eseguito] (http://nikosbaxevanis.com/blog/2014/02/23/how-to-configure-autofoq-with-foqs-return-strategy/) con [AutoFixture.AutoFoq] (http: //www.nuget.org/packages/AutoFixture.AutoFoq), anche se dovrebbe essere possibile con [AutoFixture.AutoNSubstitute] (https://www.nuget.org/packages/AutoFixture.AutoNSubstitute). –

+0

Ho pensato piuttosto a qualcosa come AutoConfiguredNSubstituteCustomization (risposto in una domanda separata), ma grazie comunque. –

Problemi correlati