问题描述
||
单元测试控制器时遇到异常行为。
我正在使用一些扩展方法来构建Url.Action,并且在生产环境中运行代码时所有方法都能正常工作,但是单元测试失败。
实际上,我的自定义Url.Action帮助程序正在使用方法:
System.Web.Routing.RouteCollection.GetVirtualPathData
确切的行是:
VirtualPathData localizedpathData =
HtmlExtensions.GetVirtualPathData(newRouteTable,
Url.RequestContext,routingValues);
字符串网址=
localizedpathData.VirtualPath.ToLower();
问题是,在对localizedpathData.VirtualPath进行单元测试时,它是一个空字符串,而不是生产代码中的路由URL。 routingValues包含三个键\“ area \”,\“ controller \”,\“ action \”,这些值与要生成url的控制器/操作的相关值有关。
奇怪的是localizedpathData.Route属性包含正确的路由!那么为什么localizedpathData.VirtualPath是一个空字符串?
我尝试使用GetVirtualPathForArea,但结果是相同的。
我正在使用MvcContrib TestControllerBuilder进行嘲笑。
示例代码在这里:
// Arrange
var loginInput = new LoginInput { EmailAddress = \"[email protected]\",Password = \"test\",RememberMe = false };
new RouteConfigurator().RegisterRoutes(() => new ResumeAreaRegistration().Registerarea(new AreaRegistrationContext(\"Resume\",RouteTable.Routes)));
var testControllerBuilder = new TestControllerBuilder();
var loginController = testControllerBuilder.CreateController<LoginController>();
loginController.Url = new UrlHelper(new RequestContext(loginController.HttpContext,new RouteData()),RouteTable.Routes);
loginController.Url.RequestContext.RouteData.Values.Add(\"area\",\"Resume\");
loginController.Url.RequestContext.RouteData.Values.Add(\"culture\",\"en-US\");
const string defaultUrl = \"/Dashboard\";
// act
var result = loginController.Index(loginInput,null);
// assert
result.ShouldNotBeNull();
result.AssertHttpRedirect().Url.ShouldBe(defaultUrl);
也许我想念什么?我忘记了什么?
预先感谢您的帮助。
解决方法
我在查看Reflector时发现它不起作用的原因是内部的RouteCollection对象在HttpResponseBase上调用ApplyAppPathModifier方法。解决方法是在HttpResponseBase模拟的ApplyAppPathModifier方法上设置期望值,以仅返回传递给它的值。如果您使用的是Rhino Mocks,那么它将看起来像这样:
loginController.HttpContext.Response.Stub(x => x.ApplyAppPathModifier(Arg<string>.Is.Anything)).IgnoreArguments().Do((Func<string,string>)((arg) => { return arg; }));