4

以下に示すメソッドを呼び出す場合、Request は常に null です。基本クラスとして ApiController を使用するコントローラーを持つ MVC4 アプリのコントローラーから JSON データを返す簡単なメソッドがいくつかあります。ディレクトリ関数のコードは次のとおりです。

public HttpResponseMessage GetDirectory() {
        try {
            var dir = r.GetDirectory();
            if (dir == null) {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError));
            }
            var response = Request.CreateResponse(HttpStatusCode.OK, dir, "application/json");
            response.Headers.Location = new Uri(Request.RequestUri, "directory");
            return response;
        } catch (Exception ex) {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }
    }

このメソッドが呼び出されると、「dir」が r.GetDirectory() から適切に読み込まれます。しかし、リクエストは null です。したがって、当然 Request.CreateResponse() は失敗します。Request が null になる理由、または戻り値が HttpResponseMessage のままになるように書き換える理由を探しています。

これは(私の単体テストプロジェクトで)呼び出されています:

var ctrl = new DirectoryController();
var httpDir = ctrl.GetDirectory();

ご協力いただきありがとうございます。

4

1 に答える 1

9

Olav Nybø は、答えにつながるヒントを残してくれました。Request.CreateResponse を使用した ASP.NET WebApi 単体テストに対応して、jonnii は次のコードを提案しました。

        controller.Request = new HttpRequestMessage();
        controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());

これにより、コントローラーをテストするための優れた方法が生まれました。

        var controller = new RecordsController();
        controller.Request = new HttpRequestMessage();
        controller.Request.Properties.Add(HttpPropertyKeys.HttpConfigurationKey, new HttpConfiguration());
        var json = controller.GetAllRecords(id);
        var records = JsonConvert.DeserializeObject<DynamicRecordSet>(json.Content.ReadAsStringAsync().Result);
于 2013-11-08T01:02:38.097 に答える