Причина, по которой result.View имеет значение null, заключается в том, что вы еще не выполнили результат просмотра в контексте контроллера, вы просто вызвали метод действия непосредственно в тесте, который возвращает ViewResult, готовый для выполнения MVC.framework.
Причина, по которой result.ViewName имеет значение null, заключается в том, что вы не указали его явно в методе действия.
Платформа MVC вызывает ExecuteResult (контекст ControllerContext) для возвращенного ViewResult, которыйзатем заполняет ViewName (если NULL) и ищет представление для отображения, вызывая FindView (context), который заполняет View.
Посмотрите на код MVC здесь, и вы могли бы понять его немного лучше:
// System.Web.Mvc.ViewResultBase
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (string.IsNullOrEmpty(this.ViewName))
{
this.ViewName = context.RouteData.GetRequiredString("action");
}
ViewEngineResult viewEngineResult = null;
if (this.View == null)
{
viewEngineResult = this.FindView(context);
this.View = viewEngineResult.View;
}
TextWriter output = context.HttpContext.Response.Output;
ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, this.TempData, output);
this.View.Render(viewContext, output);
if (viewEngineResult != null)
{
viewEngineResult.ViewEngine.ReleaseView(context, this.View);
}
}
Как Zasz заявляет выше, если вы возвращаете ViewResult в своем контроллере, явно указав ViewName, вы можете проверить его в своем тесте.
Например, вместо того, чтобы делать
return View(model);
do
return View("Index", model);
Кроме того, я согласен с Zasz в его первом пункте, ваш тест имеет какое-то странное утверждениеионы и много литья, которые не нужны.Я считаю, что наиболее краткий способ написания таких тестов выглядит следующим образом:
HomeController controller = new HomeController();
ViewResult result = controller.Index() as ViewResult;
Assert.IsNotNull(result); // Asserts that result is of type ViewResult since it will be null otherwise
// TODO: Add assertions on the model
// ...