我是新来的MVC和TDD,所以如果这是一个愚蠢的问题,请让我:) :)MVC TDD:如何编写Response.Redirect的测试?
我想要做的是,我创建了一个SignOn控制器,我只想写一个测试控制器。事情是SignOn控制器在内部执行Response.Redirect,如果它是一个正确的请求,它工作正常,但是当我运行我的测试时,它会失败,因为没有响应对象。
那么我该如何测试我的SignOn控制器,它在内部重定向?
我是新来的MVC和TDD,所以如果这是一个愚蠢的问题,请让我:) :)MVC TDD:如何编写Response.Redirect的测试?
我想要做的是,我创建了一个SignOn控制器,我只想写一个测试控制器。事情是SignOn控制器在内部执行Response.Redirect,如果它是一个正确的请求,它工作正常,但是当我运行我的测试时,它会失败,因为没有响应对象。
那么我该如何测试我的SignOn控制器,它在内部重定向?
我不是一个TDD的家伙,但直觉告诉我,HttpContextBase是你的朋友:http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx
这里是一个很好的资源。
希望这会有所帮助。
您可以用于测试控制器/演示者内导航代码的模式之一是ApplicationController。
看一看下面的描述PEAA: Application Controller
我们已经在ASP.NET应用程序中实现的Aplication控制器。
ApplicationController.Navigate(view: "LoginScreen", argument: userId);
ApplicationController检查哪些NavigationWorkflow已注册并将导航延迟到正确的类。
在你的单元测试中,你可以用类似犀牛模拟的东西来模拟NavigationWorkflow,并将它传递给你的ApplicationController。然后,您可以检查是否在工作流程中调用了正确的导航方法。
因此,不要调用Response.Redirect,而是将导航责任委托给可以用单元测试替换的单独类。
我正在考虑制作一个单独的类,但它就像我需要Response.Redirect这一次,我想不出任何其他场景,我将不得不使用Response.redirect而不是RedirectToAction,所以我没有采取这种方法,我害怕做工程。 – Sumit
当你想做重定向时,你应该使用actionresult:Redirect("url")
。在你的测试中,你可以检查actionresult是否属于RedirectResult类型,或者它是否具有正确的属性值。
我最初尝试重定向(“url”),但我想它没有做它没有重定向到我的主页,这就是为什么我转移到Response.Redirect(“url”)。 – Sumit
您的操作方法应返回RedirectResult。如果您确切知道URL的内容,则可以测试Url
属性。
实际上,如果你想要可测试的控制器,HttpContextBase可以在操作中保持清晰。为HttpContext创建一个正常工作的模型并不是微不足道的,它不必要地使测试复杂化。一般来说,最好的方法是让适当的操作结果来处理与HttpContext的交互,在这种情况下,重定向或RedirectToAction。 –
我同意Marnix,HttpContextBase让我的测试过于复杂,Infact MVC 3项目模板默认已经实现了这些。我已经从我的项目中删除了这些项目,我的项目不是那么大,以至于我需要进行如此复杂的测试,但是一旦我的应用程序变大,肯定会进行这种测试。 – Sumit