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

时间:2011-11-08 16:13:38

标签: c# asp.net-mvc-3 unit-testing rhino-mocks

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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