2013-10-08 92 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