2013-10-08 38 views
1

我正在写一些单元测试在C#中对我的WebFormsMVP代码。在我的代码,我有一些项目,其中,如果满足特定条件 - 我称之为nunit继续运行后response.redirect结束响应

Response.Redirect("urlToGoTo", true); 

但似乎所有代码重定向后,仍然执行。这是一个在nunit中的错误?或者是有什么我可以除了编写代码就像做:

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

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

--Begin Edit--

在下面的代码 - 如果我有一个测试,检查该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); 

--End Edit--

我还要指出,我设立像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); 

有什么我可以设置的最小起订量反应?

回答

0

如果您可以避免在单元测试期间访问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);  
    } 
} 

你苏特(下测试系统),注入这个类的依赖,并调用重定向

在你的单元测试,你可以存根/嘲笑HttpContextWrapper。重定向方法。

UPDATE:

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

已采取措施消除此问题,我遇到了以下博客文章。看起来,如果你可以配置你的存根的Response对象在重定向期间抛出一个异常,它会破坏执行,所以你可以进行验证。请参阅下面的更多信息。

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

+0

Thanks Rag - 但我认为我的单元测试仍然会运行其他代码。我已经修改了一下我的问题,希望能够更清楚 – ajwaka

+0

@ajwaka - 我已经更新了附加细节的答案。希望能帮助您找到解决方案。 – Spock