2

現在のコンテキストに依存するいくつかの静的メソッドをテストする必要があります。HttpContextWrapperこれで、 を使用して、自分のコードからこの依存関係を確実に削除できます。問題は、これらのメソッドで使用しているサード パーティの API にあります。彼らはに頼っているHttpContextので、私はそれについて何もできません。ただし、私がやろうとしているのは、HttpContextを myで設定することHttpContextBaseです。

したがって、私のコードは次のようになります。

public static bool IsSignedUpUser()
{
    //This calls IsSignedUpUser with the production context
    return IsSignedUpUser(new HttpContextWrapper(HttpContext.Current));
}

public static bool IsSignedUpUser(HttpContextBase context)
{
    HttpCookie objCookie = SomeExternalAPIThatReliesOnHttpContextBeingSet();

    return (objCookie != null)
}

私がやりたいことは次のようなものです:

HttpContext.Current = context; //where context is a mocked HttpContextBase

このように、サード パーティの API がHttpContextクエリ文字列、Cookie 値などを検索しているときに、NullReferenceException.

なぜこれはだまされないのですか?

デュープとして参照されている質問のコードでは、作成者は外部依存関係なしに完全に制御しているように見えます。に依存するサードパーティのライブラリを使用していますHttpContext。メソッド シグネチャを受け入れるように変更できないため、自分をHttpContextBaseに割り当てる方法が必要です。HttpContextBaseHttpContext

これが不可能であり、これまでのところ不可能であると信じている場合は、これらの依存関係を削除する方法を提案する適切な回答が必要です。500 - 内部サーバー エラーには、少なくとも 1 つの適切な提案があります。

4

2 に答える 2

4

私の見解では、 SomeExternalAPIThatReliesOnHttpContextBeingSet への呼び出しを、注入するカスタム インターフェイス メソッドに置き換えて、他のメソッドと同じようにモックできるようにする必要があります。

于 2013-02-08T21:16:56.140 に答える
2

[編集] @jessehouwing によると、"Moles" は "Fakes" になりました。これにより、Google-fu が改善されるはずです。

ああ、静的な依存関係...最悪の種類です。

それはやり過ぎかもしれませんが、私はおそらくMoles(または彼らが名前を変更したものは何でも)使用することを検討します。これにより、静的、封印などのあらゆる動作をオーバーライドできます。ここに熟読するためのいくつかのリンクがあります:

于 2013-02-08T20:22:32.353 に答える