现在UrlHelper已经made friendly进行单元测试我想用一个模拟版本替换旧的测试代码。但是我似乎无法让T4MVC的Action扩展方法实际调用mocked方法,它会根据堆栈跟踪不断触及UrlHelper的方法。
我已尝试将控制器上的Url属性设置为Moq对象,并将子类化为UrlHelper。我已经通过调试方法验证了它们都被调用了。
只需使用严格模拟来尝试生成正确的异常:
_url = new Mock<UrlHelper>(MockBehavior.Strict);
_controller.Url = _url.Object;
_controller.Url.Action(MVC.Home.Index()); //Should throw UrlHelper.RouteUrl not mocked exception
相反,我得到:
System.ArgumentNullException : Value cannot be null.
Parameter name: routeCollection
at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, String protocol, String hostName, String fragment, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
at System.Web.Mvc.UrlHelper.RouteUrl(String routeName, RouteValueDictionary routeValues, String protocol, String hostName)
at System.Web.Mvc.T4Extensions.Action(UrlHelper urlHelper, ActionResult result, String protocol, String hostName)
代码直接从T4MVCExtensions到UrlHelper。
如果我将T4MVC扩展方法中的代码复制到Web项目中的新扩展方法中,则会调用模拟的UrlHelper,并且一切都按预期工作。
public static class UrlExtensions
{
public static string Action(this UrlHelper urlHelper, ActionResult result)
{
return urlHelper.RouteUrl(null, result.GetRouteValueDictionary(), result.GetT4MVCResult().Protocol, null);
}
}
我是否错过了有关扩展方法的基本信息?我无法弄清楚可能导致扩展方法使用父类实现的情况。作为参考,我使用Resharper 8.1来运行测试,Moq 4.2和NUnit 2.6.4以及T4MVCExtensions 3.11.0。