2011-07-01 7 views
2

私は最近、作業パターンの単位を実装しました。環境として、より多くの単体テストを使用しています。現在のところ、実装はセッションに書き込むセッションヘルパーに書き込みます。どのようにセッションについてこれらの側面をテストするのですか?リポジトリパターンを作成する必要がありますか? (具体的なセッション実装と具体的な模擬実装によるリポジトリインタフェース)これはどのようにして正常に行われますか?ユニットテスト - セッションオブジェクト?

おそらく、これに近づく方法は複数ありますが、私はいくつかのアドバイスを探しています。

答えて

8

基本的に2つの方法があります。

.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コンテナを使用することができます他のオブジェクトのセッションとの対話をラップすることによって、その後、これをデータベース、Cookie、キャッシュベースの実装に変更することができます。何かのように:あなたは、あなたのテストのためのモックIStateStorageの実装を作成したり、簡単な辞書ベースの実装を作成するために部品番号を使用することができます

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

多少曖昧な質問ですが、まだいくつかのアイデアを得ようとしています。おそらく、少し質問を明確にすることができます。

セッションヘルパーを模擬、スパイ、または偽のオブジェクトに置き換えることができます。作業単位が終了したら、必要なすべてのデータがセッションヘルパーに到達したことを確認できます。私の意見では、偽のオブジェクトが望ましいですが、私はあなたのケースについて十分な詳細を知らない。この偽物をセッションにどのように届けるかは、あなたのデザインによって決まります。セッションヘルパーは、例えば構築中に作業単位に渡すことができます。リポジトリを記述したように使うこともできますが、作業単位にリポジトリを挿入し、おそらく偽のセッションヘルパーを返すために追加の偽のリポジトリを作成する必要があります。他の解決策も存在する。

セッションヘルパーとセッション自体の間の相互作用の詳細は、個別にユニットテストする必要があることに注意してください。しかし、セッションヘルパーが非常に単純なオブジェクトであれば、そのデータがセッションに正しく到達するかどうかテストできます。したがって、セッションヘルパーは間接的にテストされ、別のテストを作成する必要はありません。

関連する問題