13

タイトルが示すように、コントローラー拡張機能を適切にテストする方法についての指示を探しています。この拡張機能は、JSONResult 内で使用している部分的なビューをレンダリングします。

 public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null)
        {
            if (string.IsNullOrEmpty(viewName))
            {
                viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
            }

            controller.ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return sw.GetStringBuilder().ToString();
            }
        }

使用例:

public JsonResult Foo()
{
    var model = _repository.getSomeData();

    return Json(new { html = this.RenderPartialViewToString("Index", model) }, JsonRequestBehavior.AllowGet);
}

私は NUnit とMvcContrib テスト ヘルパーを使用していますが、この拡張機能を使用するコントローラーをセットアップすると、NRE が発生します。コントローラーのコンテキストが正しく設定されていないと思いますか?

最終的に、テストは にバーフィングしていViewEngines.Engines.FindPartialViewます。失敗したテストの一部を次に示します。

var routeData = new RouteData();
routeData.Values.Add("controller", "someName");
routeData.Values.Add("action", "someAction");

var builder = new TestControllerBuilder();
var controller = new ListingController(repository.Object);
builder.RouteData = routeData;
builder.InitializeController(controller);

var result = controller.Foo();
4

1 に答える 1

22

ViewEngines.EnginesFindPartialView 呼び出しをモックできるように、モックビュー エンジンをコレクションに追加する必要があります。Rhino Mocks を使用した例を次に示します。

var view = MockRepository.GenerateStub<IView>();
var engine = MockRepository.GenerateStub<IViewEngine>();
var viewEngineResult = new ViewEngineResult(view, engine);
engine
    .Stub(x => x.FindPartialView(null, null, false))
    .IgnoreArguments()
    .Return(viewEngineResult);
ViewEngines.Engines.Add(engine);

次に、view.Render メソッドが呼び出されたことをアサートし、その引数をインターセプトして、モック データをこのライターに書き込み、最後にコントローラー アクションがこのモック文字列を返したことをアサートできます。

于 2012-01-14T09:00:41.140 に答える