Ich habe diese Methode in meiner Datenzugriffsklasse und ich habe einen Komponententest, um sicherzustellen, dass es richtig funktioniert, aber mein Test testet die Ausnahme nicht, also ist meine Frage, sollte ich einen neuen Test erstellen, um die Ausnahme zu erzwingen oder sollte ich nur darauf vertrauen, dass der catch-Block im Falle einer Ausnahme gut funktioniert? Ist es die Mühe wert?
Hier ist ein Beispiel:
%Vor%Idealerweise sollten Sie versuchen, jede mögliche Codezeile zu testen ... das würde bedeuten, eine Ausnahme zu erzwingen, um den Ausnahmebehandler zu testen und sicherzustellen, dass dies ordnungsgemäß funktioniert.
In der Praxis wird es immer einige Codezeilen geben, die nicht behandelt werden. Allerdings würde ich Ausnahmen durch Mocking erzwingen, um Ausnahmebehandler zu testen, die Ihrer Meinung nach besonders kritisch sind oder die möglicherweise in der Produktion passieren. p>
Im Linux-Kernel befinden sich 80% der Fehler in den Treibern im Fehlerbehandlungscode.
Außergewöhnliche Behandlung ist die Quelle vieler Fehler, und Sie sollten sicher alle Ausnahmepfade testen.
Natürlich können Sie nicht jede Codezeile testen. Aber die Statistik sagt, dass Programmierer der Ausnahmebehandlung weniger Aufmerksamkeit schenken, also müssen Sie sie gründlich testen.
Hier sind meine Regeln für das ideale Testen des Fehlerverhaltens:
Der erste zeigt Ihnen, wie sich Ihr Code bei einem externen Fehler verhält, und führt häufig zu Überlegungen, was zu tun ist. In allen Situationen ist es gut zu sehen, was tatsächlich passiert. Das zweite stellt nur sicher, dass Sie halten, was Sie versprechen, soweit die Fehler, die Ihr Code erkennen sollte, als außergewöhnlich gelten. Es ist nicht anders als andere Funktionen in Ihrem Code zu testen.
Bevor Sie die Unit-Test-Suite vollständig betrachten, sollten Sie einen Blick auf Code-Coverage des getesteten Codes werfen. Für nicht-trivialen Code gibt es fast immer eine Möglichkeit, meinen Code-Zweig, den meine Unit-Tests nicht abdecken, oder schlimmer noch, ein Verhalten, das ich nicht beabsichtigt habe. Überraschenderweise ist die Lösung, diesen Code zu entfernen, anstatt weitere Tests hinzuzufügen. Nur Craft zurückgelassen, wenn es früher flügelte.
Ich sage nicht unbedingt, dass man eine 100% ige Abdeckung erreichen sollte, aber man sollte Code-Coverage-getriebene Unit-Tests durchführen, weil es ein visueller Weg ist, das existierende Code-Verhalten zu verstehen und aufzudecken. Wenn Sie es sich einmal anschauen, können Sie neue Ideen bekommen, wie Code umstrukturiert werden kann, um Prinzip der einfachen Verantwortlichkeit und Trennung von Bedenken .
Sie könnten Ihre Sitzung dazu bringen, sich über das Auslösen einer Ausnahme lustig zu machen, aber es ist wenig nötig zu testen, dass ein Catch funktioniert.
Es ist nicht falsch, einen Test zu schreiben, um zu überprüfen, ob eine Transaktion rückgängig gemacht wird, wenn ein Update eine Ausnahme auslöst, aber ich denke, dass es zu weit geht.
Vielleicht würde ein ausgeklügelter Fall es rechtfertigen.
Würdest du bei einer bestimmten Ausnahme nicht zurückrollen?
Ich hoffe, die Transaktion wird Rollback sein, wenn Displose () vor Commit () aufgerufen wird, brauchen Sie den Catch überhaupt?
Wie in anderen Fällen, wenn Ihr Fang mehr tut als nur das Problem zu protokollieren, denke ich, dass es Unit-getestet werden sollte. Lassen Sie sich jedoch nicht davon abhalten, einen Unit-Test durchzuführen.
Aus dem Namen der Ausnahme (HibernateException) würde ich denken, dass es kein Ausnahmefall ist. So kann es während des normalen Betriebs passieren. Wenn das der Fall ist, würde ich einen Test machen, der die Ausnahme verursacht, um sicherzustellen, dass es richtig gehandhabt wird.
Ich würde sicherlich jede spezielle Ausnahme testen, die abgefangen und behandelt wird. Zumindest haben Sie einen Ausführungspfad durch Ihren Abwicklungscode, der Ihnen etwas Trost geben sollte, dass nichts Seltsames passieren wird, wenn Sie jemals während der Laufzeit auf eine solche Ausnahme stoßen.
Denken Sie daran, dass Sie nur den Code testen müssen, den Sie verwenden möchten.
Tags und Links .net c# unit-testing exception