Unit-Tests singletons
Habe ich ein singleton enthält Referenz auf Statistik-Objekt.
Wenn ich paar unit-test auf dem Programm, das verwendet das singleton - die Werte aufrechterhalten, die zwischen den tests.
Ich aber, dass wenn ich dabei bin-Programm.Main () - es beginnt die Zeit zwischen den unit-tests, aber irgendwie merkt es sich die Ergebnisse vom letzten test.
Wie kann ich das schreiben von unit-tests, werden isoliert von einander (ich möchte nicht sauber () - Funktionen will ich es starten mit den neuen "alles"),
- fügen Sie einige Beispiel-code, bitte
- Dies ist eines der Probleme, mit singletons 🙂 setzen Sie die singleton (in der Regel mit der Reflexion um die _instance Zeiger auf null), oder Sie müssen sich auf das laden in eine eigene app-Domäne für die Prüfung...
- Das ist eine richtige Antwort. Warum posten Sie es als Kommentar?
- Ich würde sagen, es ist nicht eine Antwort, es ist eine Beobachtung und einen Zeiger in die richtige Richtung. Eine Antwort hätte ein bisschen mehr Substanz :0)
- Die unit-Test-framework verwenden Sie?
- Fair genug. Aber Sie nicht bekommen, rep von meinem Kommentar-upvote. 🙂
- stimmt, aber wenn man 4 Freunde zu einem upvote es, ich werde ein Zehntel der Weg zu einem Experten-Abzeichen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze version: schreiben Sie nicht Ihre singletons als singletons. Schreiben Sie als normale Klassen, und rufen Sie Sie über einen Inversion of Control container, wo Sie konfiguriert haben, die Klasse zu einer singleton-statt.
Diese Weise können Sie die unit-test der Klasse ganz gut und wenn Sie sich entscheiden, heute oder morgen, dass singleton ist nicht der richtige lifestyle für die Klasse, ändern Sie einfach die Konfiguration des IoC-Containers.
Schrieb ich einen Beitrag darüber hier: http://pvlerick.github.io/2017/03/how-to-get-rid-of-a-singleton
TL;DR:
AppDomain
pro test ist sehr schwer. NUnit, zum Beispiel, wird eine neue AppDomain pro test-session (einen Durchlauf durch alle ausgewählten tests). NUnit hat dann zu injizieren seinen code in dasAppDomain
um die tests auszuführen. Das ist nicht-trivial. Man kann nicht einfach einen neuen erstellen und erwarten, dass die Dinge auf Magische Weise in Ihr laufen. Sie haben, um Ihren code zu laufen. Insgesamt diese Antwort hat Möglichkeiten, aber ich bin nicht einverstanden mit dem "das sollte nicht allzu schwierig sein Teil".Blick auf diese Unit-Tests mit singletons
ich würde auch reccomand zu verwenden, die mocking-frameworks wie Moq
für die Isolierung Ihres test
Wenn der Versuch zu testen, das singleton selbst könnte Folgendes eine mögliche Lösung:
So, in der unit Test framework, die Sie nennen würde
Singleton.resetForTesting()
vor jeder unit-test.Hinweis: der Nachteil dieses Ansatzes ist, dass es keine code-Ebene Einschränkung, dass würde aufhören, jemand aus der Aufruf dieser Methode innerhalb der Produktion code, obwohl es ist nur dazu genutzt werden, um mit dem Test-code. Also, Sie hätten sich zu stützen auf Unterlagen zu übermitteln, die zu anderen Menschen.
Können Sie die Eigenschaft hinzufügen setter auf Ihre singleton-Klasse, ordnet singleton-Instanz. Auf diese Weise in tests können Sie die stub/mock singleton.