TDD che verifica il metodo di dipendenza invocato correttamente

1

Sto cercando di seguire TDD nel mio proj ma non riesco a capire come verificare che io stia chiamando correttamente una dipendenza o anche se dovrei provare a verificarlo. Ecco il requisito:

Scrivi una classe AddSalesOrderTask che è responsabile per l'aggiunta di un ordine a un sistema ERP. La classe può prendere qualsiasi dipendenza necessaria ma deve avere una firma del metodo Execute come questa:

public class AddSalesOrderTask {      

  public override bool Execute(OrderData input) { 
     throw new NotImplementedException();
  }
}

Il metodo AddSalesOrderTask.Execute deve mappare OrderData in ERPSalesOrder e quindi chiamare IERPClient.AddSalesOrder.

Ho un'interfaccia per accedere al servizio ERP in questo modo:

public interface IERPClient {
    void AddSalesOrder(ERPSalesOrder order);
}

Come posso verificare che la mappatura sia eseguita e poi passata nel client? Dovrei testare entrambe le operazioni con questo metodo? Per rendere questo testabile il mio primo pensiero è stato quello di introdurre un'interfaccia IMapper e passarla come dipendenza a AddSalesOrderTask:

public interface IMapper<in TFrom, in TTo> {
    void Map(TFrom source, TTo destination);
}

Seguire TDD sarebbe un buon primo test?

    private AddSalesOrderTask _testObj;

    [Fake, UsedImplicitly]
    private IERPClient _client;

    [Fake, UsedImplicitly]
    private IMapper<Order, SalesOrder> _mapper;

    [TestInitialize]
    public void MyTestInitialize() {        
        Fake.InitializeFixture(this);
        _testObj = new AddSalesOrderTask();
    }

    [TestMethod]
    public void Execute_MappedSalesOrderAddedToERP() {

        // Arrange
        var input = new OrderData();
        var salesOrder = new SalesOrder();

        // Act
        _testObj.Execute(input);

        // Assert            
        A.CallTo(() => _mapper.Map(context.Order, salesOrder))
            .MustHaveHappened();
        A.CallTo(() => _client.AddSalesOrder(salesOrder))
            .MustHaveHappened();
    }

Sto pensando a questo correttamente?

    
posta Rahul Patel 19.03.2014 - 18:35
fonte

1 risposta

1

If had a requirement that a SalesOrder needed to be added to an ERP system how would I do this in a TDD approach?

In TDD potresti iniziare con unit test per il mapper e l'ERPClient e successivamente aggiungere un test come il tuo per AddSalesOrderTask . Puoi anche cambiare l'ordine e iniziare prima con i test per AddSalesOrderTask , specialmente se vuoi fare TDD con perfezionamento graduale. Ma la domanda più interessante per il tuo AddSalesOrderTask è, come ha già indicato @RobertHarvey nel suo commento, se le parti lavorano insieme come previsto. Quindi, se vuoi che questo si sviluppi pienamente con TDD, dovresti anche scrivere un "test di integrazione" per le parti, usando il vero mapper e il vero client ERP. Tieni presente che TDD non significa necessariamente scrivere solo test di unità .

Un test di integrazione completamente automatizzato sarà più impegnativo (e verrà eseguito molto più lentamente), poiché probabilmente sarà necessario un ambiente di test completo del sistema ERP per questo test, con un set definito di dati di test. Se il tuo ERP è un mostro gonfio, questo può diventare un vero dolore, quindi devi verificare se l'approccio TDD completamente automatico qui vale lo sforzo aggiuntivo o se alcuni (semi) test manuali potrebbero essere l'alternativa migliore. Ma se pensi che questo potrebbe funzionare nel tuo caso, puoi probabilmente omettere il test unitario per la tua classe AddSalesOrderTask (almeno, a patto che la sua responsabilità sia così banale come nel tuo caso).

P.S .: Credo che dovrebbe essere

 _testObj = new AddSalesOrderTask(_mapper, _client);

in MyTestInitialize , devi iniettare le due dipendenze da qualche parte?

    
risposta data 20.03.2014 - 08:16
fonte

Leggi altre domande sui tag