Ho un metodo chiamato Buy
, quando chiamato lo fa quanto segue:
- Chiama una fabbrica per creare un ordine
- Le chiamate pagano su un oggetto di pagamento
- Chiamate vuote sul carrello del cliente
- Chiama il dao per salvare l'ordine
Questo è ciò che il mio diagramma di sequenza dice che dovrebbe accadere, tuttavia, quando scrivo il mio unit test per verificare che chiami Empty
sul carrello, fallisce (puntatori nulli) a meno che non specifichi che la fabbrica restituisce un ordine.
Quindi finisco per simulare un comportamento che non è rilevante, solo per verificare se Empty
è stato chiamato sul carrello.
È un odore riconosciuto dal codice? Quando lo riconosci nel tuo codice, lo cambi? Potrei ovviamente dividere la funzionalità del carrello vuoto, ma mi piace l'API pulita di Buy
. Per non parlare del fatto che suddividerlo richiede Empty
per essere chiamato prima o l'ultima, che in questo caso non è un problema, ma in alcune situazioni potrebbe essere.
Questo fa un po 'male ai miei test, e puzza decisamente come se il mio metodo facesse più del dovuto, quindi qualsiasi suggerimento per pulire le soluzioni sarebbe apprezzato.
//Implementation
public void Buy()
{
var order = CreateOrder();
Pay();
EmptyCart();
SaveChanges(order);
}
//Test
[TestMethod]
public void Buy_WhenCalled_CallsEmptyOnCart()
{
var cart = CreateFakeCartThatExpectsCallToEmpty();
var order = CreateFakeOrder().Object;
var orderFactory = CreateFakeOrderFactoryThatReturnsOrder(order).Object;
Cashier cashier = new Cashier(orderFactory, cart);
cashier.Buy();
cart.Verify();
}