Utilizzando FakeItEasy, come faccio a verificare se il metodo del mio oggetto chiama un altro metodo su questo stesso oggetto?Usa A.CallTo() di FakeItEasy su un altro metodo nello stesso oggetto
Il Test:
[TestMethod]
public void EatBanana_CallsWillEat()
{
var banana = new Banana();
var myMonkey = new Monkey();
myMonkey.EatBanana(banana);
//this throws an ArgumentException, because myMonkey is a real instance, not a fake
A.CallTo(() => myMonkey.WillEat(banana)
.MustHaveHappened();
}
La Classe:
public class MyMonkey {
private readonly IMonkeyRepo _monkeyRepo;
public MyMonkey(IMonkeyRepo monkeyRepo) {
_monkeyRepo = monkeyRepo;
}
public void EatBanana(Banana banana) {
//make sure the monkey will eat the banana
if (!this.WillEat(banana)) {
return;
}
//do things here
}
public bool WillEat(Banana banana) {
return !banana.IsRotten;
}
}
io sono aperto a suggerimenti. Se sto andando in questo modo tutto sbagliato, per favore fatemelo sapere.
Questo non è proprio ciò per cui FIE è, come ho capito. FIE fornisce oggetti falsi in modo che il codice di produzione possa essere più facilmente infilato e spinto. Come fai notare, non hai un falso. Nella mia esperienza, questo tipo di test di solito non è una buona idea. La tua classe MyMonkey dovrebbe essere un'unità abbastanza autonoma, e sarebbe meglio testare il suo comportamento generale quando viene ordinato di mangiare una banana, piuttosto che preoccuparsi se ha chiamato i suoi metodi. Ad esempio, saresti in grado di dire se la banana è stata mangiata sulla base di indizi di ciò che accade in "// fare le cose qui"? –
@BlairConrad nel mio scenario reale, WillEat è più complesso e ha i suoi test, e questo è solo uno dei test di EatBanana. In questo test, se lascio che EatBanana chiami il vero WillEat, non testerò due funzionalità in un test? Quindi, se WillEat fosse cambiato, potrebbe interrompere quel test, che è una cattiva notizia, giusto? –
Vedo il tuo punto. È difficile. Se 'WillEat' vivesse su un altro oggetto, saremmo tutti sollecitati a simulare quell'oggetto e a iniettarlo in' MyMonkey' (sembra doloroso). Tutto quello che posso dire è che penso che la migliore posizione di default sarebbe provare a testare "MyMonkey" dall'esterno, facendo affidamento sui risultati osservabili di un cliente. Ma, ci hai pensato sopra e hai trovato una soluzione che ti farà risparmiare dolore e riduce il numero di test e il numero che si interromperà per un dato. Conosci il codice migliore, quindi se funziona per te ... Volevo solo che tu sapessi dell'alternativa. –