2011-07-01 114 views
2

我最近實現了一個工作單元模式,並且作爲一個環境,我們正在使用更多的單元測試。目前該實現寫入會話助手,寫入會話。我如何對這些方面進行單元測試?我應該創建一個存儲庫模式嗎? (具有具體會話實現和具體模擬實現的存儲庫接口)這通常如何完成?單元測試 - 會話對象?

我知道可能有不止一種方法來解決這個問題,但我只是尋找一些建議。

回答

8

基本上有兩種方法可以做到這一點。

假設您使用的是.NET 3.5或更高版本。改變你的實現,以HttpSessionStateBase對象作爲構造參數,然後你可以模擬這個實現 - 有幾個在線的教程,介紹如何做到這一點。然後,您可以使用一個IoC容器中,在應用程序啓動到這樣組裝起來或者做類似(窮人的依賴注入):

public class MyObjectThatUsesSession 
{ 
    HttpSessionStateBase _session; 

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

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

或者,也可能更好一點,更靈活的設計將是創建一個測試縫通過將會話中的交互包裝在另一個對象中。隨後可以將其更改爲基於數據庫,Cookie或基於緩存的實現。喜歡的東西:

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

然後可以使用最小起訂量來創建你的測試一個模擬IStateStorage實現或創建一個簡單的基於字典的實現。

希望有所幫助。

+0

我喜歡可憐的人類比。:) – theusguy

0

含糊不清的問題,但我仍試圖讓你有一些想法。可能,你可以稍微澄清一下你的問題。

你可以用模擬,間諜或僞造對象替換你的會話助手。因此,在完成工作單元后,您可以驗證所有必要的數據都已到達會話助手。在我看來,虛假的對象是可取的,但我不瞭解你的案件足夠的細節。如何將此虛假信息傳遞給會話取決於您的設計。例如,會話助手可以在其構建過程中傳遞到工作單元中。或者你可以像你寫的那樣使用資源庫,但是你必須將資源庫注入到工作單元中,並且可能會創建額外的假庫來返回假會話助手。其他解決方案也存在。

請注意,會話幫助程序和會話本身之間的交互細節也應該單獨進行單元測試。但是,如果你的會話助手是一個非常簡單的對象,那麼你可以測試數據正確到達會話。因此,你的會話助手將被間接測試,你不需要爲創建單獨的測試而煩惱。