2010-08-13 3 views
6

UploadedFile이라는 클래스의 기능을 테스트하는 단위 테스트를 작성하고 싶습니다.유닛 테스트에서 HttpContext를 사용할 수있게하려면 어떻게해야합니까?

이 클래스의 정적 생성자는 HttpContext.Current 속성을 사용하며 클래스 라이브러리에서 단위 테스트를 실행하기 때문에 테스트 할 때 HttpContext가 없습니다. 내 정적 생성자에서

봐 : 나는 HttpContext.Current가 null되지 않습니다 나는이 성공적으로 설정 할 수 있도록이 내 테스트 환경에서 무엇을해야

static UploadedFile() 
{ 
    if (HttpContext.Current == null) 
     throw new Exception("web server not available"); 

    HttpServerUtility server = HttpContext.Current.Server; 

    // SET UploadedFileMappingFile Names: 
    _resourceFileNames = new StringDictionary(); 

    _resourceFileNames[_suppoertedFileStructures] = server.MapPath(SupportedUploadedFileStructures); 
    _resourceFileNames[_supportedFileStructuresXSD] = server.MapPath(SupportedUploadedFileStructuresXSD); 

    _resourceFileNames[UploadedFileEnum.UploadedFileFormatENUM.CSV.ToString()] = server.MapPath(UploadedFileColumnMap);   
} 

:

HttpServerUtility server = HttpContext.Current.Server; 

답변

10

당신은 shouldn ' 이미 발견 한 것처럼 단위 테스트가 불가능한만큼 함수에서 직접 HttpContext.Current을 사용하십시오. 대신 HttpContextBase을 사용하는 것이 좋습니다. 이는 클래스의 생성자 또는 테스트중인 메소드의 인수로 전달됩니다. 이렇게하면이 클래스의 소비자는 HttpContextWrapper을 실제로 통과 할 수 있고 단위 테스트에서는 필요한 메소드를 조롱 할 수 있습니다.

var wrapper = new HttpContextWrapper(HttpContext.Current); 
Foo.UploadedFile(wrapper); 

그리고 당신의 단위 테스트에서

( Rhino Mocks 사용) :

var contextMock = MockRepository.GenerateMock<HttpContextBase>(); 
// TODO: Define expectations on the mocked object 
Foo.UploadedFile(contextMock); 

또는, 당신이 선호하는 경우, Constructor Injection를 사용하는 예를 들어

여기 당신이 메서드를 호출 할 수있는 방법입니다.

+0

아이디어를 제공해 주셔서 감사합니다. 나는 Rhino를 사용하지 않았습니다 .Mocks.dll은 지금까지 불행하게도. 먼저 익숙해 져야 할 것 같아서 제안을 구현하려고합니다. 감사! – pencilCake

관련 문제