nunit在带有结束响应的response.redirect之后继续运行

时间:2013-10-08 23:59:08

标签: c# nunit moq

我在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上设置一些内容吗?

1 个答案:

答案 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/