asp.net-mvc – 单元测试Url.Action(使用Rhino Mocks?)
发布时间:2020-12-15 22:41:57 所属栏目:asp.Net 来源:网络整理
导读:我试图为UrlHelper扩展方法编写一个测试,这个方法是这样使用的: Url.ActionTestController(x = x.TestAction()); 但是,我无法正确设置,以便我可以创建一个新的UrlHelper,然后断言返回的URL是预期的.这是我所拥有的,但我对任何不涉及嘲笑的东西都是开放的. ;
我试图为UrlHelper扩展方法编写一个测试,这个方法是这样使用的:
Url.Action<TestController>(x => x.TestAction()); 但是,我无法正确设置,以便我可以创建一个新的UrlHelper,然后断言返回的URL是预期的.这是我所拥有的,但我对任何不涉及嘲笑的东西都是开放的. ; O) [Test] public void Should_return_Test_slash_TestAction() { // Arrange RouteTable.Routes.Add("TestRoute",new Route("{controller}/{action}",new MvcRouteHandler())); var mocks = new MockRepository(); var context = mocks.FakeHttpContext(); // the extension from hanselman var helper = new UrlHelper(new RequestContext(context,new RouteData()),RouteTable.Routes); // Act var result = helper.Action<TestController>(x => x.TestAction()); // Assert Assert.That(result,Is.EqualTo("Test/TestAction")); } 我尝试将其更改为urlHelper.Action(“Test”,“TestAction”),但它会失败,所以我知道这不是我的extensionmethod不工作. NUnit返回: NUnit.Framework.AssertionException: Expected string length 15 but was 0. Strings differ at index 0. Expected: "Test/TestAction" But was: <string.Empty> 我已经验证路由是注册和工作,我正在使用Hanselmans扩展来创建一个假HttpContext.以下是我的UrlHelper扩展方法: public static string Action<TController>(this UrlHelper urlHelper,Expression<Func<TController,object>> actionExpression) where TController : Controller { var controllerName = typeof(TController).GetControllerName(); var actionName = actionExpression.GetActionName(); return urlHelper.Action(actionName,controllerName); } public static string GetControllerName(this Type controllerType) { return controllerType.Name.Replace("Controller",string.Empty); } public static string GetActionName(this LambdaExpression actionExpression) { return ((MethodCallExpression)actionExpression.Body).Method.Name; } 任何想法,我失踪了,让它工作? 解决方法
它不工作的原因是RouteCollection对象在内部调用HttpResponseBase上的ApplyAppPathModifier方法.看起来Hanselman的模拟代码没有对该方法设置任何期望,所以它返回null,这就是为什么你所有的调用UrlHelper上的Action方法都返回一个空字符串的原因.该修复将是在HttpResponseBase mock的ApplyAppPathModifier方法上设置一个期望,以返回传递给它的值.我不是Rhino Mocks的专家,所以我不完全确定语法.如果您正在使用Moq,那么它将如下所示:
httpResponse.Setup(r => r.ApplyAppPathModifier(It.IsAny<string>())) .Returns((string s) => s); 或者,如果你只是使用一个手工制作的模拟,这样的工作: internal class FakeHttpContext : HttpContextBase { private HttpRequestBase _request; private HttpResponseBase _response; public FakeHttpContext() { _request = new FakeHttpRequest(); _response = new FakeHttpResponse(); } public override HttpRequestBase Request { get { return _request; } } public override HttpResponseBase Response { get { return _response; } } } internal class FakeHttpResponse : HttpResponseBase { public override string ApplyAppPathModifier(string virtualPath) { return virtualPath; } } internal class FakeHttpRequest : HttpRequestBase { private NameValueCollection _serverVariables = new NameValueCollection(); public override string ApplicationPath { get { return "/"; } } public override NameValueCollection ServerVariables { get { return _serverVariables; } } } 上述代码应该是HttpContextBase的最小必要实现,以便对UrlHelper进行单元测试通过.我试过了,它的工作.希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 检查DateTime类型的值在视图中是否为null,如
- asp.net-core – AspNETCore Odata批处理
- 从ASP.NET中的标准程序集覆盖资源
- asp.net – 在页面的css部分插入内联服务器标签的正确方法是
- asp.net-mvc-2 – 从MCV2视图中的模型集合中读取DataAnnota
- asp.net-mvc – ASP.NET MVC强类型视图与否?
- asp.net – 如何使用jQuery ajax避免快速结果的“闪烁”进度
- ASP.Net中的日期差异
- asp.net-core – 使用AspNet Core 2.0进行Google JWT身份验
- asp.net – 保护.net Web服务URL
推荐文章
站长推荐
- asp.net 禁用viewstate在web.config里
- ASP.net MVC5中的asp.net-mvc – CORS
- asp.net – 在静态Web方法中调用ResolveClientUr
- asp.net – 在SignalR 2.0中使用现有的IoC容器
- asp.net-mvc – 将动态JSON对象传递给Web API –
- asp.net – IIS Express(WebMatrix)打开外部连接
- asp.net – 单击GridView行上的任意位置以进入编
- Worker Service in ASP .NET Core
- asp.net-mvc – 如何将数据从AuthorizeAttribute
- asp.net-mvc – MvcSiteMapProvider安装错误
热点阅读