Mit FakeItEasy, wie überprüfe ich, ob die Methode meines Objekts eine andere Methode für das gleiche Objekt aufruft?Verwenden Sie A.CallTo() von FakeItEasy auf einer anderen Methode in demselben Objekt
Der 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();
}
Die Klasse:
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;
}
}
Ich bin offen für Vorschläge. Wenn ich alles falsch mache, lass es mich wissen.
Dies ist nicht wirklich, was FIE ist, wie ich es verstehe. FIE stellt gefälschte Objekte zur Verfügung, so dass Ihr Produktionscode einfacher gestochen werden kann. Wie Sie darauf hinweisen, haben Sie keine Fälschung. Meiner Erfahrung nach ist diese Art von Tests in der Regel keine gute Idee. Ihre MyMonkey-Klasse sollte eine ziemlich eigenständige Einheit sein, und Sie sollten besser sein Gesamtverhalten testen, wenn Sie eine Banane essen sollten, anstatt sich zu fragen, ob sie ihre eigenen Methoden nennt. Würden Sie zum Beispiel anhand von Hinweisen auf das, was in "// Dinge hier" passiert, wissen, ob die Banane gegessen wurde? –
@BlairConrad in meinem realen Szenario ist WillEat komplexer und hat seine eigenen Tests, und dies ist nur einer der Tests EatBanana hat. Wenn ich in diesem Test EatBanana das echte WillEat nennen lasse, werde ich nicht zwei Features in einem Test testen? Dann, wenn sich WillEat änderte, konnte es diesen Test brechen, was schlechte Nachrichten sind, oder? –
Ich verstehe deinen Standpunkt. Es ist schwierig. Wenn 'WillEat' auf einem anderen Objekt lebte, würden wir alle das Vortäuschen dieses Objekts drängen und es in' MyMonkey' injizieren (klingt schmerzhaft). Alles was ich wirklich sagen kann ist, dass ich denke, die beste Standardposition wäre es, 'MyMonkey' von außen zu testen, basierend auf den beobachtbaren Ergebnissen eines Kunden. Aber Sie haben darüber nachgedacht, und haben eine Lösung gefunden, die Ihnen Schmerzen ersparen wird und die Anzahl der Tests sowie die Zahl, die für eine gegebene bricht, reduziert. Du kennst den Code am besten, also wenn es für dich funktioniert ... Ich wollte nur, dass du dir der Alternative bewusst bist. –