2011-07-01 10 views
2

나는 최근에 작업 패턴의 단위를 구현했으며, 우리는 더 많은 단위 테스트를 사용하고있다. 현재 구현은 세션에 쓴 세션 도우미에 씁니다. 세션과 관련하여 이러한 부분을 어떻게 테스트합니까? 저장소 패턴을 만들어야합니까? (구체적인 세션 구현과 구체적인 mock 구현을 가진 저장소 인터페이스) 이것은 어떻게 정상적으로 수행됩니까?단위 테스트 - 세션 개체?

나는 이것에 접근하는 한 가지 이상의 방법이있을 것이라고 알고 있지만, 나는 단지 조언을 찾고있다.

답변

8

기본적으로 두 가지 방법이 있습니다.

.NET 3.5 이상을 사용한다고 가정합니다. HttpSessionStateBase 객체를 생성자 매개 변수로 사용하도록 구현을 변경하면이 구현을 조롱 할 수 있습니다. 온라인 수행 방법에 대한 온라인 자습서가 몇 가지 있습니다. 테스트 솔기를 작성하는 것입니다

public class MyObjectThatUsesSession 
{ 
    HttpSessionStateBase _session; 

    public MyObjectThatUsesSession(HttpSessionStateBase sesssion) 
    { 
     _session = session ?? new HttpSessionStateWrapper(HttpContext.Current.Session); 
    } 

    public MyObjectThatUsesSession() : this(null) 
    {} 
} 

또는, 아마 조금 더 유연 디자인 : 그런 다음 응용 프로그램을 시작할 때이 철사 나 같은 (가난한 사람의 의존성 주입)를 수행하는 IoC 컨테이너를 사용할 수 있습니다 다른 객체의 세션과의 상호 작용을 래핑하면됩니다. 나중에이를 데이터베이스, 쿠키 또는 캐시 기반 구현으로 변경할 수 있습니다. 당신은 다음 시험을위한 모의 IStateStorage 구현을 만들 MOQ를 사용하거나 간단한 사전을 기반 구현을 만들 수 있습니다

public class MyObjectThatUsesSession 
{ 
    IStateStorage _storage; 

    public MyObjectThatUsesSession(IStateStorage storage) 
    { 
     _storage= storage ?? new SessionStorage(); 
    } 

    public MyObjectThatUsesSession() : this(null) 
    {} 

    public void DoSomethingWithSession() 
    { 
     var something = _storage.Get("MySessionKey"); 
     Console.WriteLine("Got " + something); 
    } 
} 

public interface IStateStorage 
{ 
    string Get(string key); 
    void Set(string key, string data); 
} 

public class SessionStorage : IStateStorage 
{ 
    //TODO: refactor to inject HttpSessionStateBase rather than using HttpContext. 

    public string Get(string key) 
    { 
     return HttpContext.Current.Session[key]; 
    } 

    public string Set(string key, string data) 
    { 
     HttpContext.Current.Session[key] = data; 
    } 
} 

:처럼 뭔가.

희망이 있습니다.

+0

나는 가난한 남자 DI 유추를 좋아했다. :) – theusguy

0

다소 모호한 질문이지만, 여전히 아이디어를 얻으려고합니다. 아마 당신은 약간의 질문을 명확히 할 수있을 것입니다.

세션 도우미를 모방, 스파이 또는 가짜 개체로 대체 할 수 있습니다. 작업 단위를 마친 후에는 필요한 모든 데이터가 세션 도우미에 도달했는지 확인할 수 있습니다. 내 의견으로는 가짜 개체가 바람직하지만, 귀하의 경우에 대한 자세한 내용을 알지 못합니다. 세션에이 가짜를 전달하는 방법은 디자인에 따라 다릅니다. 세션 도우미는 예를 들어 작업 중에 작업 단위로 전달 될 수 있습니다. 또는 작성한대로 리포지토리를 사용할 수 있지만 리포지토리를 작업 단위에 삽입해야하며 가짜 세션 도우미를 반환하기 위해 추가 가짜 리포지토리를 만드는 것이 좋습니다. 다른 솔루션도 존재합니다.

세션 도우미와 세션 자체 간의 상호 작용에 대한 세부 정보도 별도로 테스트해야합니다. 그러나 세션 도우미가 매우 단순한 개체라면 세션이 올바르게 세션에 도달하는지 테스트 할 수 있습니다. 따라서 세션 도우미가 간접적으로 테스트되고 별도의 테스트를 만들 필요가 없습니다.