MVC TDD:如何为Response.Redirect编写测试?

4

我刚接触MVC和TDD,如果这是一个愚蠢的问题,请轻善待我 :)

我想做的是创建一个SignOn控制器,并为该控制器编写测试。问题在于,SignOn控制器在内部执行了Response.Redirect操作,如果是正确的请求,那么操作正常。但当我运行测试时,它会失败,因为没有响应对象。

那么我如何测试我的SignOn控制器,它在内部进行重定向?

4个回答

3

当您想要进行重定向时,应使用ActionResult:Redirect("url")。在测试中,您可以检查ActionResult是否为RedirectResult类型和/或是否具有正确的属性值。

请注意,此处的HTML标签已保留,不做任何修改。

我最初尝试使用Redirect("url"),但我猜它什么也没做,没有重定向到我的主页,所以我转而使用Response.Redirect("url")。 - Sumit

1

你的操作方法应该返回一个RedirectResult。如果你确切知道URL应该是什么,你可以测试Url属性。


0

在控制器/Presenter中测试导航代码的模式之一是ApplicationController。

请查看以下描述PEAA:应用程序控制器

我们已经在我们的ASP.NET应用程序中实现了Aplication Controller。

ApplicationController.Navigate(view: "LoginScreen", argument: userId);

ApplicationController会检查已注册的NavigationWorkflows并将导航委托给正确的类。

在您的单元测试中,您可以使用rhino mocks之类的工具模拟NavigationWorkflow并将其传递给ApplicationController。然后,您可以检查工作流程上调用了哪些正确的导航方法。

因此,您不需要调用Response.Redirect,而是将导航责任委托给一个可用于单元测试的单独类。


我曾考虑过将其制作成一个单独的类,但似乎只需要在这个特定的情况下使用Response.Redirect,我想不到其他需要使用Response.redirect而不是RedirectToAction的场景,所以我没有采用这种方法,我担心会过度设计。 - Sumit

0

实际上,在操作中要避免使用HttpContextBase,如果您想要测试控制器。为HttpContext创建一个适当工作的模拟并不是一件轻松的事情,而且这样做只会不必要地使测试变得复杂。通常最好的方法是让与HttpContext的交互由适当的操作结果处理,在这种情况下是Redirect或RedirectToAction。 - Marnix van Valen
我同意Marnix的观点,HttpContextBase使我的测试变得太复杂了。事实上,MVC 3项目模板默认情况下已经实现了这些功能。我曾经从我的项目中删除过这些功能,因为我的项目并不是很大,不需要如此复杂的测试。但是当我的应用程序变得越来越庞大时,一定会采取这种测试方法。 - Sumit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接