Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc asp.NETMVC:如何模拟Url.Content(“~”)?_Asp.net Mvc_Unit Testing_Moq - Fatal编程技术网

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时设置期望值……明白了,我只是不关心期望值