【问题标题】:nunit keeps running after response.redirect with end responsenunit 在 response.redirect 结束后继续运行
【发布时间】:2013-10-16 03:22:33
【问题描述】:

我正在 C# 中针对我的 WebFormsMVP 代码编写一些单元测试。在我的代码中,如果满足某个条件,我有一些项目 - 我调用

Response.Redirect("urlToGoTo", true);

但似乎重定向后的所有代码仍在执行。这是nunit中的错误吗?或者除了写代码之外我还能做些什么:

if(somethingTrue){
    Response.Redirect("toUrl", true);
    return;
}

var keepGoing = someMoreProcesses();
Response.Redirect("toSomeOtherUrl", true);

--开始编辑--

在下面的代码中 - 如果我有一个测试来检查 Response.Redirect 是否被调用过 - 它会显示它被多次调用,即使 Response 应该在第一个 之后结束>重定向

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);

--结束编辑--

我还应该声明我正在设置一个最小起订量的 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 上设置什么吗?

【问题讨论】:

    标签: c# nunit moq


    【解决方案1】:

    最好避免在单元测试期间访问 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);       
         }
     } 
    

    在你 Sut(被测系统)中,将此类作为依赖注入并调用重定向

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

    更新:

    其中一个问题“这是 nunit 中的错误吗?” 不,很确定这与测试执行上下文有关。您在测试执行上下文-存根 HttpContext 和存根 Response 对象上运行。这些不会像往常一样工作,这可能会导致即使在 Response.Redirect 之后继续执行。

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

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

    【讨论】:

    • 感谢 Rag - 但我认为我的单元测试仍会运行其他代码。我已经稍微修改了我的问题,希望更清楚
    • @ajwaka - 我已经更新了答案并添加了详细信息。希望能帮助您找到解决方案。
    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 2016-04-13
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多