2

テストの初心者なので、ご容赦ください。

次のように Url.Action によって計算された文字列を含む JsonResult を返すコントローラーがあります。

 public ActionResult GetResult(SomeModel model)
 {
     if (ModelState.IsValid)
     {
         return Json(new { redirectTo = Url.Action("Index", "Profile") });
     }
 }

そして、jQuery を使用してその結果を使用すると、アプリケーションは問題なく動作します。

ただし、単体テスト中に問題が発生しました。これは、Json 文字列のコンテンツをテストすると、アプリケーション自体では null ではないにもかかわらず、redirectTo 値が「null」に見えるためです。

私のテスト方法は次のようになります。

 [Test]
 public void GetResult_Success()
 {
     var result = controller.GetResult(new SomeModel());

     Assert.IsNotNull(result);
     Assert.IsInstanceOf<JsonResult>(result);

     var jsonResult = result as JsonResult;
     var jsonObject = JsonConvert.DeserializeAnonymousType(new JavaScriptSerializer().Serialize(jsonResult.Data), new
     {
         redirectTo = string.Empty
     });

     Assert.AreEqual("Profile/Index", jsonObject.redirectTo);
 }

jsonObject.redirectTo が null であるため、これは失敗します。コントローラーで Url.Action を「Profile/Index」に変更すると、テストに合格します。ただし、Url.Action("Index", "Profile") は単体テストでのみ null になるため失敗します。

テストのコンテキスト設定でルート値を設定しようとすると、すでに登録されていると不平を言います。Moqを使用しています。何を設定する必要があるか考えていますか?よろしくお願いします

4

1 に答える 1

0

答えはこのリンクで見つけることができます

永続性を高めるためにコピーされたコード:

public static void SetupWithHttpContextAndUrlHelper(this Controller controller)
{
    var routes = new RouteCollection();
    MvcApplication.RegisterRoutes(routes);

    //setup request
    var requestContextMock = new Mock<HttpRequestBase>();
    requestContextMock.Setup(r => r.AppRelativeCurrentExecutionFilePath).Returns("/");
    requestContextMock.Setup(r => r.ApplicationPath).Returns("/");

    //setup response
    var responseMock = new Mock<HttpResponseBase>();
    responseMock.Setup(s => s.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(s => s);

    //setup context with request and response
    var httpContextMock = new Mock<HttpContextBase>();
    httpContextMock.Setup(h => h.Request).Returns(requestContextMock.Object);
    httpContextMock.Setup(h => h.Response).Returns(responseMock.Object);

    controller.ControllerContext = new ControllerContext(httpContextMock.Object, new RouteData(), controller);
    controller.Url = new UrlHelper(new RequestContext(httpContextMock.Object, new RouteData()), routes);
}
于 2013-03-08T16:20:39.297 に答える