2011-10-20 39 views
3

我是新来的MVC和TDD,所以如果这是一个愚蠢的问题,请让我:) :)MVC TDD:如何编写Response.Redirect的测试?

我想要做的是,我创建了一个SignOn控制器,我只想写一个测试控制器。事情是SignOn控制器在内部执行Response.Redirect,如果它是一个正确的请求,它工作正常,但是当我运行我的测试时,它会失败,因为没有响应对象。

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

回答

0

我不是一个TDD的家伙,但直觉告诉我,HttpContextBase是你的朋友:http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx

这里是一个很好的资源。

http://weblogs.asp.net/gunnarpeipman/archive/2011/07/16/using-moq-to-mock-asp-net-mvc-httpcontextbase.aspx

希望这会有所帮助。

+0

实际上,如果你想要可测试的控制器,HttpContextBase可以在操作中保持清晰。为HttpContext创建一个正常工作的模型并不是微不足道的,它不必要地使测试复杂化。一般来说,最好的方法是让适当的操作结果来处理与HttpContext的交互,在这种情况下,重定向或RedirectToAction。 –

+0

我同意Marnix,HttpContextBase让我的测试过于复杂,Infact MVC 3项目模板默认已经实现了这些。我已经从我的项目中删除了这些项目,我的项目不是那么大,以至于我需要进行如此复杂的测试,但是一旦我的应用程序变大,肯定会进行这种测试。 – Sumit

0

您可以用于测试控制器/演示者内导航代码的模式之一是ApplicationController。

看一看下面的描述PEAA: Application Controller

我们已经在ASP.NET应用程序中实现的Aplication控制器。

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

ApplicationController检查哪些NavigationWorkflow已注册并将导航延迟到正确的类。

在你的单元测试中,你可以用类似犀牛模拟的东西来模拟NavigationWorkflow,并将它传递给你的ApplicationController。然后,您可以检查是否在工作流程中调用了正确的导航方法。

因此,不要调用Response.Redirect,而是将导航责任委托给可以用单元测试替换的单独类。

+0

我正在考虑制作一个单独的类,但它就像我需要Response.Redirect这一次,我想不出任何其他场景,我将不得不使用Response.redirect而不是RedirectToAction,所以我没有采取这种方法,我害怕做工程。 – Sumit

2

当你想做重定向时,你应该使用actionresult:Redirect("url")。在你的测试中,你可以检查actionresult是否属于RedirectResult类型,或者它是否具有正确的属性值。

+0

我最初尝试重定向(“url”),但我想它没有做它没有重定向到我的主页,这就是为什么我转移到Response.Redirect(“url”)。 – Sumit

0

您的操作方法应返回RedirectResult。如果您确切知道URL的内容,则可以测试Url属性。