2014-02-06 33 views
2

我正在写一些单元测试,并且我有一个场景,如果条件为真,控制器操作应返回HttpNotFoundResult,否则它应该返回ViewResult并在其中包含特定的模型。ActionResult as ViewResult返回null ..但我可以明确施放?

作为测试之一(测试应该返回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? 
} 

编辑:与要点完整的示例。对不起,它似乎并不像语法突出显示。 https://gist.github.com/DanPantry/dcd1d55651d220835899

+0

'as'运算符就像一个投射操作。但是,如果转换不可行,返回'null'而不是引发异常。 – Satpal

+1

是的,但是,'ActionResult'到'ViewResult'之间的显式转换不会引发异常 - 事实上,它可以正常工作。那么为什么'ActionResult as ViewResult'返回null? –

+0

'ViewResult'从'ActionResult'继承,因此''应该始终能够投射它。请您可以发布您的*精确*代码或您的问题的可编译的演示(您发布的代码将不会编译,所以不能这样做)。 –

回答

2

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

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

唉,升级固定它。

+0

我的两个项目都使用mvc5仍在单元测试用例中得到null任何线索为什么? – Neo

相关问题