2010-01-19 57 views

回答

10

你是指在控制器Url財產,我想,這是UrlHelper類型。我們能夠嘲笑這個的唯一方法是提取一個IUrlHelper接口,並創建一個UrlHelperWrapper類,它們都實現它幷包裝本地UrlHelper類型。然後,我們對我們的BaseController定義一個新的屬性,像這樣:

public new IUrlHelper Url 
{ 
    get { return _urlHelper; } 
    set { _urlHelper = value; } 
} 

這使我們能夠創造IUrlHelper嘲笑並注入他們,但在默認情況下使用我們的UrlHelperWrapper類的一個實例。對不起,它囉嗦很長,但正如你發現的那樣,這是一個問題,否則。但是,它不需要更改您的控制器中的任何Url.Action和類似的呼叫。

這裏的接口:

public interface IUrlHelper 
{ 
    string Action(string actionName); 
    string Action(string actionName, object routeValues); 
    string Action(string actionName, string controllerName); 
    string Action(string actionName, RouteValueDictionary routeValues); 
    string Action(string actionName, string controllerName, object routeValues); 
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues); 
    string Action(string actionName, string controllerName, object routeValues, string protocol); 
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName); 
    string Content(string contentPath); 
    string Encode(string url); 
    string RouteUrl(object routeValues); 
    string RouteUrl(string routeName); 
    string RouteUrl(RouteValueDictionary routeValues); 
    string RouteUrl(string routeName, object routeValues); 
    string RouteUrl(string routeName, RouteValueDictionary routeValues); 
    string RouteUrl(string routeName, object routeValues, string protocol); 
    string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName); 
} 

我不會打擾給你的UrlHelperWrapper的定義 - 它真的只是實現這個啞巴包裝,並通過對UrlHelper所有呼叫。

+0

其實我已經做了它沒有所有這些東西,我會發布我自己的答案 – Omu 2010-01-19 09:35:13

+0

任何人都有一個如何從David的答案設置'UrlHelperWrapper'和'BaseController'的例子嗎?我試圖實現這一點,但無法弄清楚如何將標準UrlHelper傳遞給BaseController的Url屬性。 'UrlHelper'類型不能轉換爲'IUrlHelper'。 – 2013-02-11 01:35:25

0

這是我的一個方法嘲笑url.content(並且還設置了IsAjaxRequest()爲true)

public static void SetContextWithAjaxRequestAndUrlContent(this BaseController controller) 
{ 
    var routes = new RouteCollection(); 
    RouteConfigurator.RegisterRoutesTo(routes); 


    var httpContextBase = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var respone = new Mock<HttpResponseBase>(); 


    httpContextBase.Setup(x => x.Request).Returns(request.Object); 
    httpContextBase.Setup(x => x.Response).Returns(respone.Object); 

    request.Setup(x => x.Form).Returns(new NameValueCollection()); 
    request.SetupGet(x => x.Headers).Returns(new System.Net.WebHeaderCollection {{"X-Requested-With", "XMLHttpRequest"}}); 
    request.Setup(o => o.ApplicationPath).Returns("/Account"); 
    request.Setup(o => o["X-Requested-With"]).Returns("XMLHttpRequest"); 

    respone.Setup(o => o.ApplyAppPathModifier("/Account")).Returns("/Account"); 

    controller.ControllerContext = new ControllerContext(httpContextBase.Object, new RouteData(), controller); 

    controller.Url = new UrlHelper(new RequestContext(controller.HttpContext, new RouteData()), routes); 
} 
+0

這並不嚴格地嘲笑UrlHelper,所以你不能設置對Url.Content調用的期望... – 2010-01-19 09:48:43

+0

明白了,我只是不在乎期望 – Omu 2010-01-19 11:40:26

0

我知道這個內容的時候,但是這是我現在該怎麼做:

IContentResolver.cs

using System.Web; 

namespace Web.Controllers 
{ 
    public interface IContentResolver 
    { 
     string Resolve(string imageLocation, HttpRequestBase httpRequestBase); 
    } 
} 

ContentResolver.cs

using System.Web; 
using System.Web.Mvc; 

namespace Web.Controllers 
{ 
    public class ContentResolver : IContentResolver 
    { 
     public string Resolve(string imageLocation, HttpRequestBase httpRequestBase) 
     { 
      return new UrlHelper(httpRequestBase.RequestContext).Content(imageLocation); 
     } 
    } 
} 

ContentResolverTests.cs

using System.Web; 
using System.Web.Routing; 
using Web.Controllers; 
using Moq; 
using NUnit.Framework; 

namespace Web.Tests.Controllers 
{ 
    public class ContentResolverTests 
    { 
     [TestFixture] 
     public class when_resolving_the_content_images 
     { 
      [Test] 
      public void then_should_resolve_to_proper_location() 
      { 
       // Arrange 
       var resolver = new ContentResolver(); 

       // Act 
       var httpContextBase = new Mock<HttpContextBase>(); 
       var httpRequestBase = new Mock<HttpRequestBase>(); 

       httpContextBase.Setup(@base => @base.Request).Returns(httpRequestBase.Object); 

       httpRequestBase.Setup(@base => @base.ApplicationPath).Returns("/Test"); 


       var requestContext = new Mock<RequestContext>(); 
       requestContext.SetupGet(context => context.HttpContext).Returns(httpContextBase.Object); 

       httpRequestBase.SetupGet(@base => @base.RequestContext).Returns(requestContext.Object); 

       var url = resolver.Resolve("~/Content/loading.gif", httpRequestBase.Object); 

       // Assert 
       Assert.That(url, Is.EqualTo("/Test/Content/loading.gif")); 
      } 
     } 
    } 
}