2010-06-24 20 views
5

Ich habe diese CacheManager-Klasse, die ein statisches Wörterbuch mit allen Arten von zwischengespeicherten Daten hält. Da dieses Wörterbuch jedoch statisch ist, wird es mit Daten aus den anderen Komponententests gefüllt. Dies hält mich davon ab, zu testen, ob der CacheManager bei Init leer ist oder nicht, und bricht mit den Prinzipien des Komponententests.Unit Testing CacheManager

Irgendwelche Ideen, wie man einen richtigen Komponententest dafür erstellt?

-Code

public class CacheManager 
{ 
    private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntries = 
     new Dictionary<ICacheKey, ListCacheItem>(); 

    public static Dictionary<ICacheKey, ListCacheItem> CacheEntries 
    { 
     get 
     { 
      lock (cacheEntries) 
      { 
       return cacheEntries; 
      } 
     } 
    } 

Antwort

1

Im Allgemeinen ist dies keine gute Idee, aus der Perspektive des Testens. Indem Sie die Mitglieder von CacheManager statisch machen, werden Sie niemals in der Lage sein, sie so zu isolieren, dass sie für Unit-Tests geeignet sind.

Vielleicht eine bessere Lösung ist die Singleton Pattern. Um dies zu tun, entfernen Sie die statischen Modifikatoren auf CacheManager Mitglieder. Dann können Sie eine statische Instanz in Ihrer App verwenden, die von allen anderen verwendet wird. Daher können Sie in Ihrem Komponententest eine neue Instanz der Klasse erstellen, die Sie isoliert testen können, aber dennoch über die gewünschte Funktionalität verfügen.

+0

Wie ist das besser? Wird der Singleton nicht auch die Werte zwischen den Tests behalten? – koenmetsu

+0

Richtig, der Singleton wird. Aber Sie können den 'CacheManager' selbst instanziieren und seine Mitglieder isoliert testen. In anderen Tests können Sie beispielsweise sicherstellen, dass alle anderen Teile Ihrer App dieselbe Singleton-Instanz verwenden. – dyross

+0

Also wäre Ihre Lösung, eine neue Singleton-Klasse zu erstellen, die eine Instanz des CacheManagers als eines ihrer Mitglieder enthält? – koenmetsu

1

Kurze Antwort: Sie können es nicht richtig machen. Unit Testing und Statik spielen nicht wirklich gut zusammen, Sie werden (fast) immer auf Probleme stoßen wie die, die Sie erwähnt haben.

Längere Antwort: beste Lösung wäre, Ihren Code zu refaktorieren. Selbst wenn Sie das Singleton-Verhalten benötigen, haben Sie mehrere Optionen (z. B. Abhängigkeitsinjektion). Davids Empfehlung ist natürlich auch eine Option, mit der Sie Ihren Cache testen können, aber Sie haben möglicherweise immer noch Probleme, wenn Sie den Rest des Systems testen möchten.

Wenn Sie aus irgendeinem Grund an Ihrem aktuellen Design festhalten möchten, können Sie immer noch einige (nicht notwendige) Workarounds haben. Einige Beispiele:

Am einfachsten ist es, eine "cleanCache" -Methode hinzuzufügen. In einigen Situationen kann es sogar für den Rest des Systems nützlich sein, und jeder Ihrer Tests könnte dies auch als ersten Schritt tun (in "setup/beforeTest oder ähnliche Methoden").

Sie können auch mit Sichtbarkeit spielen und Ihre Tests aufräumen lassen, was für den Rest des Codes nicht erlaubt ist.

Diese Hacks funktionieren wahrscheinlich so lange, wie Sie Ihre Tests nicht parallel ausführen.