我在C#中使用WebFormsMVP代码编写了一些单元测试。在我的代码中,我有一些项目,如果满足某个条件 - 我打电话
Response.Redirect("urlToGoTo", true);
但似乎重定向后的所有代码仍然执行。这是nunit中的错误吗?或者除了编写代码之外我还可以做些什么:
if(somethingTrue){
Response.Redirect("toUrl", true);
return;
}
var keepGoing = someMoreProcesses();
Response.Redirect("toSomeOtherUrl", true);
- 开始编辑 -
在下面的代码中 - 如果我有一个检查Response.Redirect被调用一次的测试 - 它会显示它被多次调用,即使响应应该在第一个重定向
if(somethingTrue){
//This should end the response!
Response.Redirect("toUrl", true);
}
//but this still runs in the unit test
var keepGoing = someMoreProcesses();
Response.Redirect("toSomeOtherUrl", true);
- 结束编辑 -
我还应该声明我正在建立一个moq&http; http:
HttpContext = new Mock<HttpContextBase>();
Request = new Mock<HttpRequestBase>();
Response = new Mock<HttpResponseBase>();
Session = new Mock<HttpSessionStateBase>();
HttpContext.Setup(x => x.Request).Returns(Request.Object);
HttpContext.Setup(x => x.Response).Returns(Response.Object);
HttpContext.Setup(x => x.Session).Returns(Session.Object);
我可以在moq Response上设置一些内容吗?
答案 0 :(得分:0)
最好是在单元测试期间避免访问Response.Redirect。解决这个问题的一种方法是在Response.Redirect周围创建一个包装类(“toUrl”,true);现在是。您可以确保在单元测试中存根方法。 b您可以验证Response.Redirect是否已调用。
public interface IHttpContextWrapper
{
void Reditect(strinh url)
}
您实施
public class HttpContextWrapper :IHttpContextWrapper
{
publlic void Reditect(string url)
{
Response.Redirect(url, true);
}
}
IN you Sut(被测系统),将此类注入依赖项并调用Redirect
在单元测试中,您可以存根/模拟HttpContextWrapper.Redirect方法。
<强>更新强>
其中一个问题“这是nunit中的一个错误吗?” 不,非常确定这与测试执行上下文有关。您在测试执行上下文上运行 - 已存档的HttpContext和存根的响应对象。这些将无法正常工作,这可能导致执行继续甚至在Response.Redirect。
之后已经采取了一种方法来消除这个问题,我发现了以下博客文章。看来,如果您可以将存根的响应对象配置为在重定向期间抛出异常,它将中断执行,以便您可以验证。请在下面查看更多信息。
http://joelabrahamsson.com/performing-and-testing-redirects-with-aspnet-web-forms-mvp/