如果我们点击SomeController.SomeAction()
但找不到文件 SomeAction.cshtml ,则会收到 System.InvalidOperationException 和输出错误消息。
视图' SomeAction'或者找不到它的主人,或者没有视图引擎支持搜索到的位置。搜索了以下位置:......等
但是,即使缺少此文件,下面的测试也会在 ViewResult 仍然被返回时传递。
检查操作对View()
的调用的最佳方法是什么,没有抛出异常并在 ViewResult 内容中悄悄地返回此内容?
public class SomeController: Controller
{
public ActionResult SomeAction()
{
var viewModel = new SomeModel();
return View(viewModel);
}
}
[Test]
public void TestIndex(Type clientType)
{
var controller = new SomeController();
var result = (ViewResult)controller.SomeAction();
Assert.That(result, Is.TypeOf<ViewResult>());
}
注意:这是一个更大问题的一个简单例子,此时有充分的理由进行此类测试,但这不是讨论的论坛。
答案 0 :(得分:3)
在我看来,你不应该试图断言控制器动作的单元测试中是否存在视图。您需要测试的是控制器操作行为,在这种情况下,它应该是非常简单的。所以你会测试:
另外,作为旁注,如果您有一个将操作结果强制转换为ViewResult
的测试,那么您可以明确地对其进行更改并更改操作的返回类型。这种更改使您的代码更加清晰,并且还消除了您提供的具有错误的示例测试的需要,因为如果转换失败,则不会到达断言代码,如果转换成功,则断言是多余的。
答案 1 :(得分:1)
通常,确保视图代码无错误地执行是UI测试的责任,而不是单元测试。但是,您可以尝试使用FindView方法。你只需要模拟一个ControllerContext来模仿你假装要执行的Http请求。
您可能还对Resharper的最新版本感兴趣,当您的控制器代码引用不存在的视图时,它非常适合提醒您。