ActionResult作为ViewResult返回null ..但我可以显式转换?

时间:2014-02-06 13:09:27

标签: c# asp.net-mvc as-operator

我正在编写一些单元测试,我有一个场景,如果条件为真,控制器操作应返回HttpNotFoundResult,否则它应返回ViewResult并具有特定模型在里面。

作为其中一个测试(测试应该返回ViewResult的场景),我执行操作,然后尝试将结果转换为ViewResult。但是,在使用var result = myController.MyAction() as ViewResult时(resultActionResult),result始终评估为空...但是当我执行var result = (ViewResult)myController.MyAction()时,结果为很好。

这是为什么?我不能正确理解as的用法吗?

相关代码:

// My controller
public class MyController
{
  .. 
  public ActionResult MyAction(bool condition)
  {
      if(condition)
         return HttpNotFound()
      return View(new object());
  }
}

// My test
public void MyTest()
{
  ....
  var controller = new MyController();
  var result = controller.MyAction(false) as ViewResult;
  // result should be casted successfully by as, but it's not, instead it's unll
  // however, this works
  var result = (ViewResult) controller.MyAction(false);
  // why is this?
}
编辑:gist的完整示例。对不起,似乎它不像语法高亮。 https://gist.github.com/DanPantry/dcd1d55651d220835899

1 个答案:

答案 0 :(得分:2)

由于没有人回答 - 我将我的ASP MVC更新为ASP MVC 5然后测试成功了。我有一种直觉,我的测试项目是使用ASP MVC 5,但是包含控制器的项目正在运行ASP MVC 4,并且因为它们来自不同的二进制文件,所以控制器类可以返回ViewResult的阴影ActionResult,但测试项目无法从ViewResult转换为ActionResult,因为它对ViewResult的理解不同。

虽然这看起来很愚蠢,因为人们会认为我会在这种情况下遇到构建错误。

哦,升级固定它。