2013-03-04 11 views
9

Questo test fa un uso corretto di AutoFixture e Moq? È scritto nel modo più conciso possibile? Il test fallisce, come previsto, e passa dopo aver scritto la corretta implementazione.Questo test fa un uso corretto di AutoFixture e Moq?

[Fact] 
public void CustomerPropertyIsCorrect() 
{ 
    var fixture = new AutoMoqFixture(); 

    var expected = fixture.Create<CardHolderCustomer>(); 
    var builderMock = fixture 
     .Freeze<Mock<ICustomerAdapter>>() 
     .Setup(x => x.BuildCustomer()).Returns(expected); 

    var sut = fixture.Create<CardHolderViewModel>(); 
    var actual = sut.Customer; 

    Assert.Equal(expected, actual); 
} 

risposta

16

Sembra buono! Tuttavia, puoi anche usarlo declaratively con xUnit.net extension.

Supponendo che i tipi utilizzati nel test sono definiti come:

public class CardHolderCustomer 
{ 
} 

public interface ICustomerAdapter 
{ 
    CardHolderCustomer BuildCustomer(); 
} 

public class CardHolderViewModel 
{ 
    private readonly ICustomerAdapter adapter; 

    public CardHolderViewModel(ICustomerAdapter adapter) 
    { 
     if (adapter == null) 
      throw new ArgumentNullException("adapter"); 
     this.adapter = adapter; 
    } 

    public CardHolderCustomer Customer 
    { 
     get 
     { 
      return this.adapter.BuildCustomer(); 
     } 
    } 
} 

La prova originale può essere scritta come:

[Theory, DomainTestConventions] 
public void CustomerPropertyIsCorrect2(
    CardHolderCustomer expected, 
    [Frozen]Mock<ICustomerAdapter> builderStub, 
    CardHolderViewModel sut) 
{ 
    builderStub 
     .Setup(x => x.BuildCustomer()) 
     .Returns(expected); 

    var actual = sut.Customer; 

    Assert.Equal(expected, actual); 
} 

Il DomainTestConventionsAttribute è definito come:

internal class DomainTestConventionsAttribute : AutoDataAttribute 
{ 
    internal DomainTestConventionsAttribute() 
     :base(new Fixture().Customize(new DomainTestConventions())) 
    { 
    } 
} 

Il DomainTestConventions è definito come:

internal class DomainTestConventions : CompositeCustomization 
{ 
    internal DomainTestConventions() 
     :base(new AutoMoqCustomization()) 
    { 
    } 
} 

noti che DomainTestConventions deriva da CompositeCustomization che sostanzialmente significa che è possibile creare più personalizzazioni e aggiungerli come parametri al costruttore di base.

È anche possibile leggere:

Speranza che aiuta.

+1

Grazie! Questo è esattamente il feedback che stavo cercando. – cocogorilla

+10

Devo solo aggiungere ... il fatto che abbiate riprodotto il mio codice cieco si dimostra migliore di qualsiasi altro libro agile che i test siano la fonte primaria di documentazione per il codice. – cocogorilla

+0

+1 Solo un'ottima risposta –

0

Penso che questo sia conciso e leggibile. Ma mi chiedo il valore di questo tipo di test .

Il test è denominato CustomerPropertyIsCorrect, quindi presumo che questo sia ciò che si desidera testare. Poiché istruisci il metodo BuildCustomer del tuo ICustomerAdapter per restituire l'istanza bloccata creata in precedenza, e poiché il codice del modello di visualizzazione utilizzerà questo codice quando viene eseguito in xUnit, sì, l'oggetto congelato verrà effettivamente restituito.

Ora, non sono ancora all-in campo TDD (ancora), quindi questo potrebbe essere solo io, non "ottenere" TDD. Ma per quanto posso vedere, questo test verificherà che il modello di visualizzazione abbia qualche istanza CardHolderCustomer nella sua proprietà Customer - ma non necessariamente quella "corretta". Dov'è il valore in questo?