nunit 在响应后继续运行.重定向与结束响应



我正在用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'd 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);

我可以在最小起订量响应上设置一些东西吗?

最好避免

在单元测试期间访问 Response.Redirect。解决这个问题的一种方法是围绕 Response.Redirect("toUrl", true( 创建一个包装类;现在 a.您可以确保在单元测试中存根该方法。 b 您可以验证是否调用了 Response.Redirect。

public interface IHttpContextWrapper
{
    void Reditect(strinh url)
} 

您的实施

 public class HttpContextWrapper :IHttpContextWrapper
 {
     publlic void Reditect(string url)
     {
            Response.Redirect(url, true);       
     }
 } 

在 sut(被测试系统(中,将此类作为依赖项注入并调用重定向

在单元测试中,您可以存根/模拟 HttpContextWrapper.Redirect 方法。

更新:

其中一个问题"这是nunit中的错误吗?不,非常确定这与测试执行上下文有关。在测试执行上下文上运行 - 存根 HttpContext 和存根响应对象。这些操作不会像往常一样工作,这可能会导致即使在响应重定向之后执行也会继续。

已经采取了一种方法来消除这个问题,我遇到了下面的博客文章。似乎如果您可以将存根响应对象配置为在重定向期间引发异常,它将中断执行,以便您可以验证。请参阅下面的更多信息。

http://joelabrahamsson.com/performing-and-testing-redirects-with-aspnet-web-forms-mvp/

最新更新