有人知道如何模仿Url.Content("~")
吗?
(顺便说一句:我正在使用Moq)
答案 0 :(得分: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
。
答案 1 :(得分: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);
}
答案 2 :(得分: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"));
}
}
}
}
答案 3 :(得分:0)
controller.Url = Substitute.ForPartsOf<UrlHelper>();
controller.Url.Content("~").Returns("path");
在NUnit中使用ForPartsOf (Partial subs and test spies)免费下载