我一直在使用ASP.NET MVC一段时间,似乎发现自己不断从我的控制器返回ActionResult以外的东西。我显然返回了ViewResults,还有JSonResults以及我们内部构建的一些自定义结果。
我想知道,如果,而不是声明我的控制器方法,如:
public ActionResult Index()
我应该开始将它们声明为
public ViewResult Index()
或
public JsonResult Search()
如果我总是知道我的控制器上的Index操作将始终返回ViewResult,或者我的控制器上的Search操作将始终返回JsonResult?
编辑:只是为了澄清,我正在特别谈论我总是希望返回特定类型的ActionResult的情况。
答案 0 :(得分:6)
我投赞成票有两个原因。
您明确声明了您希望该方法返回的内容,编译器将捕获任何其他尝试。不需要进行Assert的单元测试(结果是ViewResult)。
在检查该结果类型的唯一属性时,必须将结果强制转换为测试中的预期类型(例如,检查RedirectResult的Url属性)。简单地将测试变量声明为var
可以消除因更改类型而导致的任何脆弱性。
答案 1 :(得分:2)
通过声明更具体的返回类型,您可以获得更多的编译器类型检查,而现在您不必在单元测试中进行覆盖。
然而,您将自己绑定到该类型,并且如果更改则必须还原。一个常见的例子是,如果您必须通过返回RedirectResult将用户重定向到某些特殊条件的其他位置。
答案 2 :(得分:1)
我会把它留作通用的ActionResult。如果您将其作为特定结果并在以后进行更改,则需要重新编写一些(如果不是全部)单元测试以适应更改。这将使您的单元测试比他们需要的更脆弱。
编辑:此外,通过将其保留为ActionResult,您可以根据您的操作逻辑返回各种不同的结果。例如,方法的正常流可能会返回RedirectResult,但您可能有返回ViewResult或HttpUnauthorizedResult的错误路径。如果您输入的方法比最初需要的方法更强烈,那么您最终可能会在以后添加替代结果时不必要地重构它和测试。
最重要的是,我没有看到任何真正的优势,至少有一些缺点。