2012-02-06 3 views
6

私がテストしている特定のクラスは、HttpSessionStateオブジェクトに依存します。パブリックコンストラクタのない密閉クラスを擬似しますか?

HttpSessionStateクラスにはパブリックコンストラクタがありません。テスト対象のクラスは、このオブジェクトをNameValueストアとしてのみ使用しています。このクラスは、特定のメソッドの情報を返すためにASMX Webサービスで使用されます。

私はHttpSessionStateクラスの周りのファサードを作成することを考えています。ここでは、テストでSessionオブジェクトではなくという文字列をDictionary <という文字列で提供できます。

これは良い考えですか、それとも標準的な方法ですか?

答えて

8

古い言い回しのように、別の抽象レイヤーを追加することで解決できないものはありません。私は通常、インターフェイスのメソッドが、そのタイプで必要なアクションを実行するために必要なインターフェイスだけのインターフェイスの背後にあるタイプを非表示にします。

だけHttpSessionStateを隠しインタフェースを模擬し、インターフェイスの用途にアサートん、Rhinoで(D => ....)それはちょうどAssertWasCalledだモックなど

+3

「別の抽象レイヤーを追加することで解決できないものはありません」 - 「多くの抽象レイヤーに」=) – Restuta

+0

私はオリジナルの「間接的なレベルの間接的な問題は解決できません。 "ある時点では、httpsessionstateを隠しているものなど、レベルをテストすることはできませんが、実際にはテストできませんが、 「何か」を行うには、このように入力します。 –

+0

オリジナルは気にしません、それはちょうど真です=) – Restuta

2

あなたは、サブクラスを作成することができますHttpSessionStateBaseクラスのThis answerはこれをMoq用に実装する方法を示していますが、Rhino MockでMockHttpSessionクラスを使用することはできます(私はRhino Mockを使用していません)。

public class MockHttpSession : HttpSessionStateBase 
{ 
    Dictionary<string, object> sessionStorage = new Dictionary<string, object>(); 

    public override object this[string name] 
    { 
     get { return sessionStorage[name]; } 
     set { sessionStorage[name] = value; } 
    } 
} 

.NETのクラスをモックする方法についてかなり広範な議論がスコットHanselman氏のブログhereで見つけることができます。

+0

はHttpSessionStateBaseクラスはWebサービスで利用できますか? –

+0

@PeterSmith HttpSessionStateBaseはSystem.Web名前空間にあります。 – jhsowter

2

Microsoft's Moles Isolation framework for .NETを使用して、封印されたものであってもあらゆるタイプのモックを行うことができます。セットアップに少し時間がかかりますが、別の抽象レイヤーを追加するよりも良いかもしれません。モルを使用してHttpContextHttpSessionStateを暴露することについては、hereを参照してください。別の同様の議論hereがあります。

+1

もう1つのプロジェクト依存関係を取得することが確実であるとは確信していません。「新しい分離フレームワーク」とは、小さな抽象概念よりも単純なソリューションです。 – Restuta

+0

@Restuta、ええ、あなたはおそらく正しいでしょうが、それはオプションであり、少なくとも "封印されたクラスを黙らせる"という質問のタイトルに答えます。 –

関連する問題