Asp.net mvc asp.NETMVC:如何模拟Url.Content(“~”)?
有人知道如何模拟Asp.net mvc asp.NETMVC:如何模拟Url.Content(“~”)?,asp.net-mvc,unit-testing,moq,Asp.net Mvc,Unit Testing,Moq,有人知道如何模拟Url.Content(“~” (顺便说一句:我使用的是Moq)我猜您指的是控制器中的Url属性,它的类型是UrlHelper。我们能够模拟它的唯一方法是提取一个IUrlHelper接口,并创建一个urlhelperrapper类,该类既实现了它,又包装了本机UrlHelper类型。然后,我们在BaseController上定义一个新属性,如下所示: public new IUrlHelper Url { get { return _urlHelper; } se
Url.Content(“~”
(顺便说一句:我使用的是Moq)我猜您指的是控制器中的
Url
属性,它的类型是UrlHelper
。我们能够模拟它的唯一方法是提取一个IUrlHelper
接口,并创建一个urlhelperrapper
类,该类既实现了它,又包装了本机UrlHelper
类型。然后,我们在BaseController
上定义一个新属性,如下所示:
public new IUrlHelper Url
{
get { return _urlHelper; }
set { _urlHelper = value; }
}
这允许我们创建IUrlHelper
的mock并注入它们,但在默认情况下使用urlhelperrapper
类的实例。对不起,这是一个冗长的问题,但正如你所发现的,这是一个问题,否则。但是,它确实可以访问,而无需更改控制器中的任何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);
}
我不想麻烦您给出
urlHelperRapper
的定义-它实际上只是一个愚蠢的包装器,实现了这一点,并将所有调用传递给UrlHelper这是我的一个方法,它模拟url.content(并将IsAjaxRequest()设置为true)
公共静态void SetContextWithAjaxRequestAndUrlContent(此BaseController)
{
var routes=new RouteCollection();
RouteConfigurator.RegisterRoutesTo(路由);
var httpContextBase=new Mock();
var request=newmock();
var respone=new Mock();
Setup(x=>x.Request).Returns(Request.Object);
Setup(x=>x.Response).Returns(respone.Object);
Setup(x=>x.Form).Returns(newNameValueCollection());
SetupGet(x=>x.Headers).Returns(newsystem.Net.WebHeaderCollection{{{“x-Requested-With”,“XMLHttpRequest”});
Setup(o=>o.ApplicationPath)。返回(“/Account”);
request.Setup(o=>o[“X-request-With”])。返回(“XMLHttpRequest”);
respone.Setup(o=>o.ApplyAppPathModifier(“/Account”)。返回(“/Account”);
controller.ControllerContext=新的ControllerContext(httpContextBase.Object,new RouteData(),controller);
controller.Url=new UrlHelper(new RequestContext(controller.HttpContext,new RouteData()),routes);
}
我知道此内容很旧,但我现在就是这样做的:
IContentResolver.cs
using System.Web;
namespace Web.Controllers
{
public interface IContentResolver
{
string Resolve(string imageLocation, HttpRequestBase httpRequestBase);
}
}
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);
}
}
}
ContentResolver.cs
using System.Web;
namespace Web.Controllers
{
public interface IContentResolver
{
string Resolve(string imageLocation, HttpRequestBase httpRequestBase);
}
}
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"));
}
}
}
}
使用System.Web;
使用System.Web.Routing;
使用Web.controller;
使用最小起订量;
使用NUnit.Framework;
命名空间Web.Tests.Controllers
{
公共类ContentResolverTests
{
[测试夹具]
解析内容图像时的公共类
{
[测试]
公共无效则\u应\u将\u解析为\u正确的\u位置()
{
//安排
var resolver=new ContentResolver();
//表演
var httpContextBase=new Mock();
var httpRequestBase=new Mock();
httpContextBase.Setup(@base=>@base.Request).Returns(httpRequestBase.Object);
httpRequestBase.Setup(@base=>@base.ApplicationPath)。返回(“/Test”);
var requestContext=new Mock();
SetupGet(context=>context.HttpContext).Returns(httpContextBase.Object);
httpRequestBase.SetupGet(@base=>@base.RequestContext).Returns(RequestContext.Object);
var url=resolver.Resolve(“~/Content/load.gif”,httpRequestBase.Object);
//断言
Assert.That(url为.EqualTo(“/Test/Content/load.gif”);
}
}
}
}
controller.Url=Substitute.ForPartsOf();
controller.Url.Content(“~”)返回(“路径”);
在NUnit中获得自由什么是Url
?它是一种类型吗?属性?它是UrlHelper类型属性(get)实际上我已经在没有这些东西的情况下完成了,我将发布我自己的答案任何人都可以从David的答案中获得一个如何设置UrlHelperRapper
和BaseController
的示例吗?我试图实现这一点,但无法理解如何将标准的UrlHelper
传递到BaseController的Url属性。UrlHelper
类型不能转换为“IUrlHelper”。严格来说,这并不是在模仿UrlHelper,因此您不能在调用Url.Content时设置期望值……明白了,我只是不关心期望值