Leere Methoden mit Moq „kurzschließen“?

Mein Team hat kürzlich die Entscheidung getroffen, Moq als Spott-Framework für seine enorme Flexibilität und gut lesbare Syntax zu verwenden. Als Neuling stolpere ich über scheinbar einfache Fragen - Suchanfragen (hier, Google usw.) führen zu zahlreichen Diskussionen über andere Nuancen von Moq, aber nicht unbedingt über das, wonach ich suche, und Aus den wenigen scheinbar verwandten Fragen sind rote Heringe geworden.

Wir testen eine Klasse mit einer externen Abhängigkeit (genauer gesagt Amazon SimpleDb), möchten jedoch nicht, dass unsere Tests eine Live-Verbindung herstellen. Eine bestimmte Methode:

Wendet eine Geschäftslogik anRuft gegebenenfalls einen Anruf bei SDB über einen von uns erstellten Anbieter auf, nennen wir ihnSaveItem()

Ich möchte dies so testen, dass wir den erforderlichen Kontext einrichten und sicherstellen, dassSaveItem() wurde angerufen, aber in einer Weise, dieSaveItem() wird wirklich nicht aufgerufen (weil A) der Anbieter von SDB ein Mock ist, der nicht vollständig hydratisiert ist und wahrscheinlich bombardiert wird, und B) ich möchte für diese Transaktion nicht hunderte und tausende Male bezahlen müssen.

Beim Umgang mit Methoden, die einen Wert zurückgaben, war dies trivial.

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo");

In dem Fall, dass ich oben skizziere, mein "SaveItem()msgstr "" "Methode ist ungültig und daher die Option, Moqs zu verwendenReturns() Methode ist nicht verfügbar. Und währenddessen kann ich einen Rückruf einrichten, um dies zu überprüfenSaveItem() wird angerufen, ich kann aber scheinbar nicht dazu bringen, eigentlich gar nichts zu tun.

Naiv / hoffnungsvoll, ich dachte, das Folgende würde funktionieren, aber es scheint immer noch die Methode aufzurufen:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>()));

Also die Millionen-Dollar-Frage: Was ist der Moq des folgenden fiktiven Codes?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE();

Antworten auf die Frage(1)

Ihre Antwort auf die Frage