1

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

--结束编辑--

我还应该声明我正在设置一个最小起订量的 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);

我可以在最小起订量响应上设置什么吗?

4

1 回答 1

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

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

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

更新:

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

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

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

于 2013-10-09T01:35:14.740 回答