繁体   English   中英

如何检查一个动作对View()的调用没有抛出异常?

[英]How to check an action's call to View() has not thrown an exception?

如果我们点击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>());
}

注意:这是一个更大问题的一个简单示例,此时有充分的理由进行此类测试,但这不是讨论的论坛。

在我看来,你不应该试图断言控制器动作的单元测试中是否存在视图。 您需要测试的是控制器操作行为,在这种情况下,它应该是非常简单的。 所以你会测试:

  • Action返回默认视图;
  • Action为视图传递正确的模型。

另外,作为旁注,如果您有一个将操作结果强制转换为ViewResult的测试,那么您可能也要明确它并更改操作的返回类型。 这种更改使您的代码更加清晰,并且还消除了您提供的具有错误的示例测试的需要,因为如果转换失败则未达到断言代码,并且如果转换成功,则断言是多余的。

通常,确保视图代码无错误地执行是UI测试的责任,而不是单元测试。 但是,您可以尝试使用FindView方法。 您只需要模拟一个ControllerContext来模仿您假装执行的Http请求。

您可能还对最新版本的Resharper感兴趣,当您的控制器代码引用不存在的视图时,它非常适合提醒您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM