2008-10-28 6 views
9

단위 테스트가없는 프로젝트의 함수에 대한 단위 테스트를 구현하려고하는데이 함수에 System.Web.Caching이 필요합니다. 오브젝트를 매개 변수로 캐시하십시오. 나는 ... 같은 코드를 사용하여이 개체를 만드는 데단위 테스트에서 System.Web.Caching.Cache 개체 만들기

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

을 시도 ... 다음 매개 변수로에서 '캐시'를 통과하지만 추가() 함수는 NullReferenceException이 원인이되어 왔습니다. 내 최고의 추측 지금까지 단위 테스트 에서이 캐시 개체를 만들 수 없습니다 및 HttpContext.Current.Cache에서 검색 할 필요가 분명히 단위 테스트에 액세스 할 수 없습니다.

System.Web.Caching.Cache 개체를 매개 변수로 사용하는 함수를 단위 테스트하려면 어떻게합니까?

+1

사람들이 쉽게 찾을 수 있도록 질문에 맞춤법을 수정 해주십시오. Cachcing = Caching (당신이나 다른 것을 고르려고하지 않고 - 단지 도우려는 것) – Chris

답변

8

이런 종류의 문제 (문제의 클래스가 인터페이스를 구현하지 않는 곳)에 직면했을 때, 문제의 클래스와 관련된 인터페이스가있는 래퍼가 작성되는 경우가 종종 있습니다. 그렇다면 내 코드에서 래퍼를 사용합니다. 단위 테스트를 위해, 나는 래퍼를 모의하고 그것에 내 자신의 mock 객체를 삽입한다.

물론 조롱 프레임 워크가 작동하는 경우 대신 사용하십시오. 내 경험에 따르면 모든 조롱 프레임 워크는 다양한 .NET 클래스에 몇 가지 문제가 있습니다.

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]); 
} 

실제 코드는

... 

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

manager.Add(item,value); 

... 
2

모의 개체 (Rhino Mocks를 살펴보십시오)를 사용하는 것이 가장 좋습니다.

1

단위 테스트 레거시 코드에 대한 매우 유용한 도구는 TypeMock Isolator입니다. 그것은 당신이 캐시 객체를 완전히 무시할 수있게 해줄 것입니다. 다른 모의 프레임 워크와 달리 TypeMock은 리플렉션을 사용하여 사용자가 모의하도록 지정하는 메서드 호출을 가로 채기 때문에 성가신 래퍼를 처리 할 필요가 없습니다.

TypeMock 은 상용 제품이지만이지만 오픈 소스 프로젝트에는 무료 버전이 있습니다. 그들은 을 사용하여 단일 사용자 라이센스 인 "커뮤니티"에디션을 가지고 있지만 여전히 제공되는지는 알 수 없습니다.

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); 
관련 문제