2010-03-05 180 views
3

我想單元測試我從DotNetOpenAuth例子得到的代碼,但我很難讓UrlHelper在我的測試中工作。單元測試Url.Action

在我的控制器上的LogOn ActionResult的某處,它調用以下UrlHelper。以下示例是該ActionResult的簡化版本。

public ActionResult TestUrlHelper() 
{ 
    var test = Url.ActionFull("LogOnReturnTo"); 
    return View(); 
} 

我的測試看起來是這樣的:

[Test] 
public void TestTest() 
{ 
    AccountController controller = GetAccountController(); 
    var result = controller.TestUrlHelper(); 
} 

這是UrlHelper擴展方法:

internal static Uri ActionFull(this UrlHelper urlHelper, string actionName) 
{ 
    return new Uri(urlHelper.RequestContext.HttpContext.Request.Url, 
        urlHelper.Action(actionName)); 

} 

的GetAccountController方法我從以下question了。我試圖根據需要調整設置,但我不得不承認我完全不瞭解所有設置。

private static AccountController GetAccountController() 
{ 
    var MockIFormsAuthentication = new Mock<IFormsAuthentication>(); 
    var MockIOpenIdRelyingParty = new Mock<IOpenIdRelyingParty>(); 
    var MockRealm = new Realm("http://www.google.be"); 

    var routes = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routes); 

    var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
    request.SetupGet(x => x.ApplicationPath).Returns("/"); 
    request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/Account/LogOnReturnTo", UriKind.Absolute)); 
    request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

    var response = new Mock<HttpResponseBase>(MockBehavior.Strict); 
    response.Setup(x => x.ApplyAppPathModifier("/Account/LogOnReturnTo")).Returns("http://localhost/Account/LogOnReturnTo"); 

    var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
    context.SetupGet(x => x.Request).Returns(request.Object); 
    context.SetupGet(x => x.Response).Returns(response.Object); 

    var Controller = new AccountController(MockIFormsAuthentication.Object, MockIOpenIdRelyingParty.Object, MockRealm); 
    Controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), Controller); 
    Controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes); 

    return Controller; 
} 

我得到的錯誤是:

HttpResponseBase.ApplyAppPathModifier( 「/首頁/ LogOnReturnTo」)調用失敗,仿製品的行爲嚴格。

在正確的方向任何幫助或推高度讚賞

+1

您可能想要切換到MockBehavior.Loose,然後:)那窩總的來說,這是個好主意。 – 2010-03-05 14:19:19

回答

2

MockBehavior.Strict

讓模擬更像一個「真正模擬」,提高例外任何不有相應的期望。

(從德Moq wiki

因此,如果您設置MockBehaviorLoose,它:

不會拋出並返回默認值或空數組,可枚舉,等等。如果沒有期望值爲成員設置