Einheit Testing Singletons

8

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),

    
Eyal 05.05.2011, 12:31
quelle

5 Antworten

15

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.

    
Roy Dictus 05.05.2011, 12:47
quelle
2

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: Ссылка

    
Philippe 05.05.2011 12:42
quelle
1

Sehen Sie sich Komponententests mit Singletons an

Ich würde auch empfehlen, die spöttischen Frameworks wie Moq

zu verwenden

zur Isolierung Ihres Tests

    
Serghei 05.05.2011 12:37
quelle
0

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.

    
Sid 13.01.2017 18:35
quelle
0
___ qstnhdr ___ Einheit Testing Singletons ___ answer5897908 ___

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.

    
___ answer5897755 ___

Sehen Sie sich Komponententests mit Singletons an

Ich würde auch empfehlen, die spöttischen Frameworks wie Moq

zu verwenden

zur Isolierung Ihres Tests

    
___ qstntxt ___

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),

    
___ answer5897837 ___

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: Ссылка

    
___ answer48310406 ​​___

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.

    
___ tag123unittesting ___ Unit Testing ist eine Methode, bei der einzelne Quellcode-Einheiten auf ihre Tauglichkeit getestet werden. ___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123singleton ___ Ein Entwurfsmuster, das sicherstellt, dass genau eine anwendungsweite Instanz einer bestimmten Klasse existiert. Eines der kreativen Designmuster der Gang of Four. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ answer41641304 ___

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.

    
___
tytyryty 17.01.2018 21:37
quelle

Tags und Links