更新时间:2022-11-23 10:02:28
我假设您是指控制器中的Url
属性,类型为UrlHelper
.我们能够模拟的唯一方法是提取一个IUrlHelper
接口,并创建一个实现和包装本机UrlHelper
类型的UrlHelperWrapper
类.然后,我们在BaseController
上定义一个新属性,如下所示:
You are referring to the Url
property in the controllers, I presume, which is of type UrlHelper
. The only way we have been able to mock this is to extract an IUrlHelper
interface, and create a UrlHelperWrapper
class that both implements it and wraps the native UrlHelper
type. We then define a new property on our BaseController
like so:
public new IUrlHelper Url
{
get { return _urlHelper; }
set { _urlHelper = value; }
}
这允许我们创建IUrlHelper
的模拟并注入它们,但是在默认情况下使用UrlHelperWrapper
类的实例.抱歉,它已经long绕了,但是正如您所发现的,否则这是一个问题.但是,它确实可以插入而无需更改控制器中的任何Url.Action
和类似调用.
This allows us to create mocks of IUrlHelper
and inject them, but in the default case to use an instance of our UrlHelperWrapper
class. Sorry it's long winded, but as you have discovered, it's a problem otherwise. It does, however, drop in without the need to change any of your Url.Action
and similar calls in your controllers.
以下是界面:
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);
}
我不会为您提供UrlHelperWrapper
的定义-实际上,它只是一个笨拙的包装器,实现了此功能,并将所有调用传递给UrlHelper
.
I won't bother giving you the definition of UrlHelperWrapper
- it really is just a dumb wrapper that implements this, and passes all calls through to UrlHelper
.