Ecco come farlo con la costruzione di affermazioni in ogni chiamata di metodo.
// Arrange - Build the necessary assertions into the stubbed method invocations.
var mock = MockRepository.GenerateMock<ISomeService>();
mock.Stub(m => m.Method1()).WhenCalled(inv => mock.AssertWasNotCalled(m => m.Method2()));
mock.Stub(m => m.Method2()).WhenCalled(inv => mock.AssertWasNotCalled(m => m.Method3()));
// Act
myObject.Service = mock;
// Assert - Ensure each expected method was called.
mock.AssertWasCalled(m => m.Method1());
mock.AssertWasCalled(m => m.Method2());
mock.AssertWasCalled(m => m.Method3());
Poiché si tratta di mescola normale modello organizzare-act-assert eseguendo affermazioni a metà del gesto, mi piace di includere messaggi di errore molto specifiche per questi casi per identificare fallimenti dei test più facilmente.
mock.Stub(m => m.Method1()).WhenCalled(inv =>
mock.AssertWasNotCalled(m => m.Method2(), opt =>
opt.Message("Method2 cannot be called before Method1.")));
Si può anche ottenere un risultato simile salvando il risultato di ciascuna chiamata in una variabile durante la fase atto, e quindi controllare gli stati variabili durante la fase di asserzione. Ciò preserva meglio la divisione del modello di assetto-atto-assert, ma è più un codice idraulico da scrivere e mantenere.
// Arrange - Build the necessary state variables into the stubbed method invocations.
bool wasMethod1Called;
bool wasMethod2Called;
bool wasMethod2CalledBeforeMethod1;
bool wasMethod3CalledBeforeMethod2;
var mock = MockRepository.GenerateMock<ISomeService>();
mock.Stub(m => m.Method1()).WhenCalled(inv =>
{
wasMethod1Called = true;
});
mock.Stub(m => m.Method2()).WhenCalled(inv =>
{
wasMethod2Called = true;
wasMethod2CalledBeforeMethod1 = !wasMethod1Called;
});
mock.Stub(m => m.Method3()).WhenCalled(inv =>
{
wasMethod3CalledBeforeMethod2 = !wasMethod2Called;
});
// Act
myObject.Service = mock;
// Assert - Ensure each expected method was called, and that they were called in the right order.
mock.AssertWasCalled(m => m.Method1());
mock.AssertWasCalled(m => m.Method2());
mock.AssertWasCalled(m => m.Method3());
Assert.That(wasMethod2CalledBeforeMethod1, Is.False, "Method2 cannot be called before Method1.");
Assert.That(wasMethod3CalledBeforeMethod2, Is.False, "Method3 cannot be called before Method2.");
fonte
2014-07-30 16:02:20
Questo non è sempre il caso. Esistono contratti di oggetti statici in cui l'ordine è importante e non è sempre possibile evitare tali contratti. – sanosdole
Sono d'accordo con il commento di @sanosdole ma nel mio caso eri azzeccato. Dovrei testare il risultato ... non l'implementazione. Grazie! – MoMo
Se il codice ha già un accoppiamento temporale, dovrebbe anche essere testato. – SerG