Question

Comme le dit le titre, je suis à la recherche de l'orientation sur la façon de tester correctement une extension du contrôleur. L'extension rend une vue partielle qui, à son tour, je me sers dans un 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();
            }
        }

Exemple d'utilisation:

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

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

J'utilise NUnit et l'assistant de test MvcContrib , mais lors de la mise en place d'un contrôleur qui fait usage de cette extension, je suis en cours d'exécution dans une NRE. Je suppose que le contexte du contrôleur n'est pas configuré correctement?

En fin de compte le test est Barfing sur ViewEngines.Engines.FindPartialView. Voici une partie du test défaillant:

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();
Était-ce utile?

La solution

Vous devez ajouter un moteur de vue moqué de la collection ViewEngines.Engines afin que vous puissiez se moquer de l'appel FindPartialView. Voici un exemple avec 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);

Ensuite, vous pouvez affirmer que la méthode view.Render a été appelé, intercepter ses arguments et écrire des données moquaient cet écrivain et enfin affirmer que votre action du contrôleur retourne cette chaîne se moqua.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top