10

HttpContextをパラメーターとして受け取るメソッドの単体テストをいくつか書いています。リクエストがPOSTの場合、動作が期待どおりであることをテストしたいと思います。

System.Net.HttpWebRequestを作成する場合、メソッドを設定するのは簡単ですが、HttpContextで使用されるSystem.Web.HttpRequestを作成するときに、メソッドを指定する方法がわかりません。

何か案は?

コンテキストの場合、メソッドはhttphandlerによって呼び出され、要求がPOSTでない場合は405をスローすることになっています。web.configのVerbsプロパティを使用して許可されるメソッドをフィルタリングできることはわかっていますが、将来誰かが動詞プロパティを変更して他のメソッドを許可することを妨げるものは何もありません。その場合は、ハンドラーに処理を依頼します。それ自体の。

現在使用されているヘルパーメソッド:

    private HttpContext GetHttpContext(string requestUrl)
    {
        var httpRequest = new HttpRequest("", requestUrl, "");            
        var stringWriter = new StringWriter();
        var httpResponce = new HttpResponse(stringWriter);
        return new HttpContext(httpRequest, httpResponce);
    }
4

1 に答える 1

8

ユニットテストの目的で、モックオブジェクトを調査することをお勧めします。.NETで利用できるモックフレームワークがいくつかあり、まさにこのタイプのテストを容易にします。

たとえば、ここの記事では、Moqフレームワークを使用してHttpMethodを設定しています。

記事から:

public ContextMocks(Controller onController, string HTTPMethod)
{
    //...
    Request = new Moq.Mock<HttpRequestBase>();
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod);
    //...
}

とはいえ、これが1回限りのテストであり、十分に強調することができず、特定の状況でオブジェクトのモックを導入することによって発生するオーバーヘッドが不要な場合は、次のリフレクションによってHttpMethodが設定されます。

typeof(HttpRequest).GetField("_httpMethod", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(httpRequest, "POST");

前に述べたように、、などを使用したテストがHttpContext定期HttpRequest的なテーマであるか、今後も繰り返される場合は、モックフレームワークを利用してください。長期的には時間を節約できます。

于 2012-12-04T02:58:43.170 に答える