我正在编写一些单元测试,我有一个场景,如果条件为真,控制器操作应返回HttpNotFoundResult
,否则它应返回ViewResult
并具有特定模型在里面。
作为其中一个测试(测试应该返回ViewResult
的场景),我执行操作,然后尝试将结果转换为ViewResult
。但是,在使用var result = myController.MyAction() as ViewResult
时(result
为ActionResult
),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
答案 0 :(得分:2)
由于没有人回答 - 我将我的ASP MVC更新为ASP MVC 5然后测试成功了。我有一种直觉,我的测试项目是使用ASP MVC 5,但是包含控制器的项目正在运行ASP MVC 4,并且因为它们来自不同的二进制文件,所以控制器类可以返回ViewResult
的阴影ActionResult
,但测试项目无法从ViewResult
转换为ActionResult
,因为它对ViewResult
的理解不同。
虽然这看起来很愚蠢,因为人们会认为我会在这种情况下遇到构建错误。
哦,升级固定它。