0

単体テストの目的で模擬リクエストを実行するためのこのコードを見つけました。ユーザーホストアドレスを設定しようとしていますが、このコードで概説されているのと同じ方法を使用してそれを達成する方法が明確ではありません。ヘッダーの設定が許可されていないことがわかったので、リフレクションを通じて行う必要があると考えています。これを達成する方法はありますか?

public static HttpContext FakeHttpContext()
        {
            var httpRequest = new HttpRequest("", "http://fakurl/", "");
            var stringWriter = new StringWriter();
            var httpResponse = new HttpResponse(stringWriter);
            var httpContext = new HttpContext(httpRequest, httpResponse);

            var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
                                                    new HttpStaticObjectsCollection(), 10, true,
                                                    HttpCookieMode.AutoDetect,
                                                    SessionStateMode.InProc, false);

            httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
                                        BindingFlags.NonPublic | BindingFlags.Instance,
                                        null, CallingConventions.Standard,
                                        new[] { typeof(HttpSessionStateContainer) },
                                        null)
                                .Invoke(new object[] { sessionContainer });

            httpContext.Request.Headers["REMOTE_ADDR"] = "XXX.XXX.XXX.XXX"; // not allowed
            return httpContext;
        }

このモックライブラリも試しました:

https://gist.github.com/rally25rs/1578697

ユーザーのホストアドレスはまだ読み取り専用です。

4

1 に答える 1

0

私が見つけた最善のアプローチは、IContextService インターフェイスを実装するある種の ContextService を持つことです。このクラス/インターフェースのペアは、必要なすべての操作を実行できます。ポイントは、 MOQのような単体テストでモック フレームワークを使用する場合、モック コンテキスト サービスを接続して特定の IP アドレスを返すことができるということです。

この StackOverflow の投稿には、いくつかの適切な指針があります: Moq: HttpContext に依存するメソッドの単体テスト

アップデート:

あなたが見つけたStackOverflowの投稿も良いものです:「モックされた」BaseHttpContextにIP(UserHostAddress)を設定する方法は?

context/request/response オブジェクトからいくつかのプロパティしか必要としないことがよくあるので、自分の小さなバリアントを作成することがよくあります。

public class ContextService : IContextService
{
    public string GetUserHostAddress()
    {
        return HttpContext.Current.Request.UserHostAddress;
    }
}
public interface IContextService
{
    string GetUserHostAddress();
}

そのクラス/インターフェイスの組み合わせを使用して、Moq を使用して偽のサービスを接続できます。

var contextMock = new Moq.Mock<IContextService>();
contextMock.Setup(c => c.GetUserHostAddress()).Returns("127.0.0.1");

を呼び出すたびにcontextMock.GetUserHostAddress()、「127.0.0.1」が返されます。本格的な (またはとにかく可能な限り完全な) HttpContext モックのすべての機能を必要としない場合は特に、独自のロールを作成することは、優れた学習体験になる可能性があります。

于 2013-11-07T18:37:54.697 に答える