Mock di rinoceronte:Come posso deridere un metodo che trasforma il suo input?
-
09-06-2019 - |
Domanda
Ho un oggetto di accesso ai dati TransactionDao.Quando chiami TransactionDao.Save(transaction) vorrei che impostasse un flag Transaction.IsSaved=true (questa è una semplificazione, la cosa che sto cercando di fare non è così banale).Quindi, quando derido il mio TransactionDao con RhinoMocks, come posso indicare che dovrebbe trasformare il suo input?
Idealmente vorrei scrivere qualcosa del genere:
Expect.Call(delegate {dao.Save(transaction);}).Override(x => x.IsSaved=true);
Qualcuno sa come fare questo?
Anche se ho ricevuto un suggerimento su come farlo dalla risposta specificata di seguito, la firma del tipo effettivo è disattivata, devi fare qualcosa del genere:A causa di ciò che ha pubblicato Mark Ingram, sembra che la risposta migliore, anche se nessuno lo abbia detto esplicitamente, è fare questa:
public delegate void FakeSave(Transaction t);
...
Expect.Call(delegate {dao.Save(t); }).Do( new FakeSave(delegate(Transaction t2) { t.IsSaved = true; }));
Soluzione
Gola,
La soluzione più semplice, che ho trovato, applicata alla tua domanda è la seguente:
Expect.Call(() => dao.Save(transaction))
.Do(new Action<Transaction>(x => x.IsSaved = true));
Quindi non è necessario creare un delegato speciale o altro.Basta usare Action che si trova nelle librerie .NET 3.5 standard.
Spero che questo aiuto.František
Altri suggerimenti
Puoi ottenere questo risultato utilizzando il callback Do:
Expect.Call(delegate {dao.Save(transaction);})
.Do(x => x.IsSaved = true);
dovresti deridere la transazione e farla restituire true per IsSaved, se puoi ovviamente deridere la transazione.
ITransaction transaction = _Mocker.dynamicMock<ITransaction>;
Expect.Call(transaction.IsSaved).IgnoreArguments.Return(true);
_mocker.ReplayAll();
dao.Save(transaction);