nUnit тестирование метода расширения контроллера - PullRequest
0 голосов
/ 21 декабря 2018

UX Control Framework, который я использую, требует метода расширения на контроллерах MVC.Ссылка на нулевой объект генерируется, когда nUnit пытается вызвать этот метод (используется для упаковки частичного представления в Json).

Автор инфраструктуры предложил вызывать этот метод через интерфейс, однако это просто откладываетnull error.

Есть ли способ протестировать ActionResult из контроллера, использующего метод расширения?

Метод Controller Create () возвращает результирующий фрагмент из метода расширения:

return Json(new { Content = viewRender.RenderPartialView(this, "ListItems/SimpleSyllabi", new[] { nS }) });

Подпись метода расширения

 public static string RenderPartialView(this Controller controller, string viewName, object model = null, bool removeWhiteSpace = true);

Ошибка проста:

System.NullReferenceException: 'Object reference not set to an instance of an object.'

Результат StackTrace:

at System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView(ControllerContext controllerContext, String partialViewName, Boolean useCache)
   at System.Web.Mvc.ViewEngineCollection.<>c__DisplayClass2.<FindPartialView>b__0(IViewEngine e)
   at System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths)
   at System.Web.Mvc.ViewEngineCollection.FindPartialView(ControllerContext controllerContext, String partialViewName)
   at Omu.AwesomeMvc.ControllerExtensions.RenderView(Controller controller, String viewName, Object model, String master, Boolean partial, Boolean removeWhiteSpace)
   at Omu.AwesomeMvc.ControllerExtensions.RenderPartialView(Controller controller, String viewName, Object model, Boolean removeWhiteSpace)
   at Flipprs.nUnitHelpers.Awesome.ViewRender.RenderPartialView(Controller controller, String viewName, Object model, Boolean removeWhiteSpace) in A:\Stephan\Source\Workspaces\AchievementCards\Develop-Payment(v0.0.11.0)\Flipprs.Web\Helpers\Awesome\nUnitHelpers.cs:line 17
   at Flipprs.Controllers.SyllabusAjaxListController.Create(SyllabusCreateViewModel scvm) in A:\Stephan\Source\Workspaces\AchievementCards\Develop-Payment(v0.0.11.0)\Flipprs.Web\Controllers\SyllabusAjaxListController.cs:line 217
   at Flipprs.Tests.Controllers.SyllabusAjaxListControllerTest.SyllabusAjaxListController_CreatePUT_ReturnsJson(String HTTPreqAUEmail) in A:\Stephan\Source\Workspaces\AchievementCards\Develop-Payment(v0.0.11.0)\Flipprs.Tests\Controllers\SyllabusAjaxListControllerTest.cs:line 484
Result Message: System.NullReferenceException : Object reference not set to an instance of an object.

Тест интеграции 'Настройка ':

 private IViewRender viewRender;

viewRender = new ViewRender();



controller = new SyllabusAjaxListController(viewRender, photoPlaceholderService, activityService, syllabusService,
            userService, organisationService, userManager);

Затем в тесте (выдержки)

  [Test, Sequential]
            public void SyllabusAjaxListController_CreatePUT_ReturnsJson()
{
    ActionResult result_ar = controller.Create(validModel);

            JsonResult result = result_ar as JsonResult;
}

Интеграционные тестовые макеты

        Mock<ControllerContext> controllerContext;
        Mock<HttpContext> httpContext;
        Mock<HttpContextBase> contextBase;
        Mock<HttpRequestBase> httpRequest;
        Mock<HttpResponseBase> httpResponse;

        Mock<IIdentity> identity;
        Mock<IPrincipal> principal;
        Mock<GenericPrincipal> genericPrincipal;

1 Ответ

0 голосов
/ 22 декабря 2018

Похоже, что тестируемый объект может быть тесно связан с проблемами сторонней реализации, которые затрудняют его тестирование в отдельности.

Я предлагаю высмеивать абстракцию визуализации представления, указанную в вашем исходном утверждении

public interface IViewRender {
    string RenderPartialView(Controller controller, string viewName, object model = null, bool removeWhiteSpace = true);
}

для возврата строки при вызове, чтобы тестируемый метод мог пройти до завершения и вы могли утверждать, что ожидали поведения.

//Arrange

//...

var viewRenderMock = new Mock<IViewRender>(); //Using Moq mocking framework
viewRenderMock
    .Setup(_ => _.RenderPartialView(It.IsAny<Controller>(), It.IsAny<string>(), It.IsAny<object>(), true))
    .Returns("some fake view string");

//...

var controller = new SyllabusAjaxListController(viewRenderMock.Object,...) {
    //...
};

//Act
var result = controller.Create(validModel) as JsonResult;

//Assert
result.Should().NotBeNull(); //FluentAssertions

//...other assertions.
...