Richtige Methode für die Prüfung für eine Ausnahme mit Moq und MSTest

Ein wenig Verwirrung im Hinblick auf das Verhalten von Moq mit MsTest.

Edit: Das ist nicht eine Frage des "Wie Teste ich?" oder "Wie kann ich geltend machen?", dies ist ein Notizblock, um zu sehen, wie MoQ funktioniert so nicht konzentrieren sich auf den Typ der Ausnahme usw.

Ich denke, eine bessere Frage kann => "Macht Moq Wirft<> ähnlich verhält wie MsTest ExpectedExceptionAttribute?" Das heißt, Sie sind in der Erwartung einer Ausnahme in den test oder das SUT?

Ich würde gerne wissen, wie MoQ "Wirft" funktioniert, wenn verwendet mit MsTest. Ist es besser, nicht zu verwenden, die MsTest erwartete Ausnahme-Attribut? Ist es besser, ein try..catch innerhalb des Tests? Ich habe ein paar Fragen rund um diese.

Ich bin Mocking eine Datenbank aufrufen, und wenn ein Fehler Auftritt ich möchte wieder null (0).

Den TestMethod ist gerade nach vorne mit dem MsTest-Ausnahme-Attribut, und der wirft mit Ausnahme Moq. Es funktioniert nur, wenn ich eine Ausnahme innerhalb der SaveCart Methode und nicht, wenn ich null zurückgeben.

Ich würde gerne verstehen, die zugrunde liegenden Verhalten, weil es fühlt sich an, als ob ich sollte nicht, noch wollen, um eine Ausnahme innerhalb der SaveCart Methode.

Hier ist der Test unter Frage:

[TestMethod]
[ExpectedException(typeof(ApplicationException))]
public void CartRepoSaveCartExceptionShouldReturnZero()
{
     _cartDatabaseMock.Setup(c => c.SaveCart(_cart))
                                   .Throws<ApplicationException>();

    var result = _cartRepository.SaveCart(_cart);

    Assert.AreEqual(result, _cartSaveExceptionValue);
}

Hier ist die grundlegende SaveCart, die KEINE Ausnahme auslöst, verursacht der test fehlschlägt:

public long SaveCart(Cart cart )
{
    long returnValue;

    try
    {
        returnValue = _cartDatabase.SaveCart(cart);
    }
    catch (Exception)
    {
        return 0;
    }
    return returnValue;
}

Hier ist eine grundlegende SaveCart, wo der test funktioniert, weil es eine Ausnahme:

public long SaveCart(Cart cart )
{
    long returnValue;

    try
    {
        returnValue = _cartDatabase.SaveCart(cart);
    }
    catch (Exception)
    {
        throw new ApplicationException();
    }
    return returnValue;
}

Fühlen Sie sich frei, einen Vorschlag für einen besseren Titel für die Frage, ob es nicht ganz klar erklären.

  • Möchten Sie vielleicht einen Blick auf diese: stackoverflow.com/questions/16053433/...
  • Ich kann nicht scheinen, um herauszufinden, irgendeine Moq-Dokumentation, quickstart wenig auf Sie github.com/Moq/moq4/wiki/Quickstart. Und die Doku hat nur ein einfaches Beispiel nudoq.org/#!/Pakete/Moq/Moq/IThrows/M/Wirft ich denke, wo meine Verwirrung liegt, ist wie ein moq Ausnahme funktioniert.Es erscheint die Methode, die getestet wurde, eine exception werfen, für die es zu sprudeln, um die test-Methode und dann die Blase bis zu dem MsTest-attribute, aber dies ist verwirrend für mich.
  • Ich denke, dein Titel ist etwas irreführend, andere auf den richtigen Weg, um zu testen moq. Wenn Sie wollen wissen, was Los ist unter der Haube, so dass Ihr test, um zu scheitern oder zu übergeben. Ich schlage vor, Sie kommen mit einem besseren Titel. Alle Antworten hier sind völlig gültig in Bezug auf die richtige Art und Weise zu testen moq Ausnahme. Wie auch immer, ich denke, deine Frage ist das zugrunde liegende Verhalten, warum Sie Ihren test pass/fail. Ich nahm einen stab und veröffentlicht die Antwort.
  • Ich bin mir sicher, dass der Titel kann irreführend sein, wie ich bereits in der Frage. Ich habe buchstäblich keine Ahnung, was MoQ "wirft" tut.
  • So hat die Antwort, die ich gepostet, die Antwort auf Ihre Frage oder Sie sind immer noch verwirrt oder habe ich deine Frage missverstanden? Wie auch immer, lassen Sie es mich wissen. Ich werde versuchen, mein bestes, um zu helfen.
  • Macht den test übergeben mit der basic SaveCart Methode, wenn Sie entfernen Sie den [ExpectedException] - Attribut?
  • Nein, es wird nicht. Es ist, weil das "Ergebnis" ist 0 und _cartSaveExceptionValue (ich nehme an, hier ist die ApplicationException). Auskommentieren der [ExpectedException] - Attribut wird nur lassen Sie die test-Methode wissen, was zu erwarten ist.
  • Rabeeh hinzufügen zu meinem vorherigen Kommentar für übersichtlichkeit. Wenn der test-Methode NICHT eine exception zu werfen und Sie dekorieren Ihre test-Methode mit ExpectException Attribut, MSTest-Marke wird der test als nicht bestanden.
  • Ich habe gerade unten kommentiert und von Ihnen positiv bewertet werden zwei Antworten. Beide geklärt, die Verhaltensweisen zu mir, also Sie bekommen beide eine Abstimmung meiner Meinung nach. Ich wünschte nur, es war besser docs für MoQ? Und ja, ich entfernte die MsTest-attribute, und synchronisiert den Typ der Ausnahme zwischen Methoden und die null zurück in die Fang-und voila. Ich habe immer noch das Gefühl, es gibt mehr zu verstehen, mit MoQ. Gibt es eine definitive Quelle von docs? Ich kommentierte oben meine Frage oben mit ein paar links, aber zu sagen, dass Sie "Dünn" wird Ihnen mehr Kredit, als Sie verdienen.
  • Hmm. Ich kann nicht zwei Antworten den "Antwort" - haha. Also, was zu tun ist.....NKD ist ein großer Punkt und wird eine richtige Antwort. Und ich halte es für "mehr" richtig, als OldFox ist, aber Sie beantwortet meine Frage in einer Art und Weise.

InformationsquelleAutor Sam Rabeeh | 2016-05-18
Schreibe einen Kommentar