2008-10-28 19 views
9

Ich versuche, einen Komponententest für eine Funktion in einem Projekt zu implementieren, das keine Komponententests aufweist. Für diese Funktion ist ein System.Web.Caching erforderlich. Cache-Objekt als Parameter Ich habe versucht, dieses Objekt zu erstellen, mithilfe von Code wie ...Erstellen eines System.Web.Caching.Cache-Objekts in einem Komponententest

System.Web.Caching.Cache cache = new System.Web.Caching.Cache(); 
cache.Add(...); 

... und dann Übergabe des ‚Cache‘ als Parameter, aber die Add() Funktion eine Nullreferenceexception verursacht. Meine beste Vermutung ist bisher, dass ich dieses Cache-Objekt in einem Komponententest nicht erstellen kann und es aus dem HttpContext.Current.Cache abrufen muss, auf das ich offensichtlich in einem Komponententest nicht zugreifen kann.

Wie testen Sie Unit-Einheiten, die ein System.Web.Caching.Cache-Objekt als Parameter benötigen?

+1

Können Sie bitte Ihre Rechtschreibung in der Frage korrigieren, so dass die Leute es einfacher finden können? Cachcing = Caching (nicht versuchen, auf Sie oder irgendetwas zu picken - nur versuchen zu helfen) – Chris

Antwort

8

Wenn ich mit dieser Art von Problem konfrontiert bin (wo die betreffende Klasse keine Schnittstelle implementiert), schreibe ich oft einen Wrapper mit zugehöriger Schnittstelle um die fragliche Klasse. Dann benutze ich meinen Wrapper in meinem Code. Bei Komponententests speichere ich den Wrapper und lege mein eigenes Mock-Objekt hinein.

Natürlich, wenn ein Mock Framework funktioniert, dann verwenden Sie es stattdessen. Meiner Erfahrung nach haben alle Mock-Frameworks Probleme mit verschiedenen .NET-Klassen.

public interface ICacheWrapper 
{ 
    ...methods to support 
} 

public class CacheWrapper : ICacheWrapper 
{ 
    private System.Web.Caching.Cache cache; 
    public CacheWrapper(System.Web.Caching.Cache cache) 
    { 
     this.cache = cache; 
    } 

    ... implement methods using cache ... 
} 

public class MockCacheWrapper : ICacheWrapper 
{ 
    private MockCache cache; 
    public MockCacheWrapper(MockCache cache) 
    { 
     this.cache = cache; 
    } 

    ... implement methods using mock cache... 
} 

public class MockCache 
{ 
    ... implement ways to set mock values and retrieve them... 
} 

[Test] 
public void CachingTest() 
{ 
    ... set up omitted... 

    ICacheWrapper wrapper = new MockCacheWrapper(new MockCache()); 

    CacheManager manager = new CacheManager(wrapper); 

    manager.Insert(item,value); 

    Assert.AreEqual(value, manager[item]); 
} 

Echt Code

... 

CacheManager manager = new CacheManager(new CacheWrapper(HttpContext.Current.Cache)); 

manager.Add(item,value); 

... 
2

Ich denke, Ihre beste Wette wäre, ein Mock-Objekt zu verwenden (schauen Sie in Rhino Mocks).

1

Ein sehr nützliches Werkzeug für die Einheit Code Testen Vermächtnis ist TypeMock Isolator. Es ermöglicht Ihnen, das Cache-Objekt vollständig zu umgehen, indem Sie es auffordern, diese Klasse zu verspotten, und alle Methodenaufrufe, die Sie als problematisch empfinden. Im Gegensatz zu anderen Mock-Frameworks verwendet TypeMock Reflection, um die Methodenaufrufe abzufangen, von denen Sie sagen, dass sie sie für Sie vortäuschen, damit Sie sich nicht mit umständlichen Wrappern herumschlagen müssen.

TypeMock ist ein kommerzielles Produkt, aber es hat freie Versionen für Open-Source-Projekte. Sie verwendet, um eine "Community" -Edition zu haben, die eine Einzelplatzlizenz war, aber ich weiß nicht, ob das noch angeboten wird.

0
var httpResponse = MockRepository.GenerateMock<HttpResponseBase>(); 
var cache = MockRepository.GenerateMock<HttpCachePolicyBase>(); 
    cache.Stub(x => x.SetOmitVaryStar(true)); 
    httpResponse.Stub(x => x.Cache).Return(cache); 
    httpContext.Stub(x => x.Response).Return(httpResponse); 
    httpContext.Response.Stub(x => x.Cache).Return(cache); 
Verwandte Themen