Ich habe ein Singleton, das einen Verweis auf ein Statistikobjekt enthält.
Wenn ich ein paar Komponententests für das Programm durchführe, das dieses Singleton verwendet - die Werte, die zwischen den Tests bestehen.
Ich denke, wenn ich Program.Main () mache, beginnt alles zwischen Unit-Tests, aber irgendwie merkt es sich die Ergebnisse des letzten Tests.
Wie kann ich Komponententests schreiben, die voneinander isoliert sind (Ich will keine clean () Funktionen - Ich möchte, dass es mit neuem "alles" neu beginnt),
Kurzfassung: Schreiben Sie Ihre Singletons nicht als Singletons. Schreiben Sie sie als normale Klassen und rufen Sie sie über den Container Inversion of Control auf, in dem Sie die Klasse stattdessen als Singleton konfiguriert haben.
Auf diese Weise können Sie die Klasse problemlos testen und wenn Sie sich heute oder morgen dafür entscheiden, dass Singleton nicht der richtige Lebensstil für die Klasse ist, ändern Sie einfach die Konfiguration des IoC-Containers.
Nun, das scheint logisch, da Ihr Singleton wahrscheinlich auf AppDomain-Ebene ist. Solange Sie sich in derselben AppDomain befinden, wird nur eine für alle Ihre Tests vorhanden sein.
Ich weiß nicht, wie Test-Frameworks damit umgehen, aber wenn Sie das selbst machen wollen, müssen Sie für jeden Ihrer Tests eine separate AppDomain erstellen, aber mir wird gesagt, dass dies ziemlich schwierig sein wird: Ссылка
Sehen Sie sich Komponententests mit Singletons an
Ich würde auch empfehlen, die spöttischen Frameworks wie Moq
zu verwendenzur Isolierung Ihres Tests
Wenn Sie versuchen, das Singleton selbst zu testen, könnte das Folgende eine mögliche Lösung sein:
%Vor% Also würden Sie in Ihrem Unit-Test-Framework vor jedem Unit-Test Singleton.resetForTesting()
aufrufen.
Hinweis : Der Nachteil dieses Ansatzes besteht darin, dass es keine Einschränkung auf Codeebene gibt, die jemanden daran hindern würde, diese Methode innerhalb des Produktionscodes aufzurufen, obwohl sie nur mit Testcode verwendet werden soll. Sie müssen sich also auf die Dokumentation verlassen, um das anderen zu vermitteln.
Kurzfassung: Schreiben Sie Ihre Singletons nicht als Singletons. Schreiben Sie sie als normale Klassen und rufen Sie sie über den Container Inversion of Control auf, in dem Sie die Klasse stattdessen als Singleton konfiguriert haben.
Auf diese Weise können Sie die Klasse problemlos testen und wenn Sie sich heute oder morgen dafür entscheiden, dass Singleton nicht der richtige Lebensstil für die Klasse ist, ändern Sie einfach die Konfiguration des IoC-Containers.
Sehen Sie sich Komponententests mit Singletons an
Ich würde auch empfehlen, die spöttischen Frameworks wie Moq
zu verwendenzur Isolierung Ihres Tests
Ich habe ein Singleton, das einen Verweis auf ein Statistikobjekt enthält.
Wenn ich ein paar Komponententests für das Programm durchführe, das dieses Singleton verwendet - die Werte, die zwischen den Tests bestehen.
Ich denke, wenn ich Program.Main () mache, beginnt alles zwischen Unit-Tests, aber irgendwie merkt es sich die Ergebnisse des letzten Tests.
Wie kann ich Komponententests schreiben, die voneinander isoliert sind (Ich will keine clean () Funktionen - Ich möchte, dass es mit neuem "alles" neu beginnt),
Nun, das scheint logisch, da Ihr Singleton wahrscheinlich auf AppDomain-Ebene ist. Solange Sie sich in derselben AppDomain befinden, wird nur eine für alle Ihre Tests vorhanden sein.
Ich weiß nicht, wie Test-Frameworks damit umgehen, aber wenn Sie das selbst machen wollen, müssen Sie für jeden Ihrer Tests eine separate AppDomain erstellen, aber mir wird gesagt, dass dies ziemlich schwierig sein wird: Ссылка
Sie können Ihrer Singleton-Klasse, die die Singleton-Instanz neu zuweist, einen Property-Setter hinzufügen. Auf diese Weise können Sie Ihren Singleton in Tests testen.
Wenn Sie versuchen, das Singleton selbst zu testen, könnte das Folgende eine mögliche Lösung sein:
%Vor%Also würden Sie in Ihrem Unit-Test-Framework vor jedem Unit-Test %code% aufrufen.
Hinweis : Der Nachteil dieses Ansatzes besteht darin, dass es keine Einschränkung auf Codeebene gibt, die jemanden daran hindern würde, diese Methode innerhalb des Produktionscodes aufzurufen, obwohl sie nur mit Testcode verwendet werden soll. Sie müssen sich also auf die Dokumentation verlassen, um das anderen zu vermitteln.
Tags und Links .net c# unit-testing singleton