我的控制器/操作中有以下代码行
var defaultRoute = Url.RouteUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });
我正在编写一个单元测试并需要模拟这一行以使其返回一些 URL。我不知道我怎么能这样做。谁能帮我为这条线写一个测试。
谢谢
我的控制器/操作中有以下代码行
var defaultRoute = Url.RouteUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });
我正在编写一个单元测试并需要模拟这一行以使其返回一些 URL。我不知道我怎么能这样做。谁能帮我为这条线写一个测试。
谢谢
您始终可以为不可测试的包装类创建一个包装类,然后对其进行模拟:
public interface IUrlRouterWrapper
{
// Put any methods you want to mock here...
void RouteUrl(string routeName, RouteValueDictionary routeValues);
}
public class UrlRouterWrapper : IUrlRouterWrapper
{
// ... and implement them here, calling through to the real, non-testable class.
public void RouteUrl(string routeName, RouteValueDictionary routeValues)
{
Url.RouteUrl(routeName, routeValues);
}
}
然后在您使用 RouteUrl 的代码中:
public class SomeOtherClass
{
private readonly IUrlRouterWrapper _urlRouterWrapper;
public SomeOtherClass(IUrlRouterWrapper urlRouterWrapper)
{
_urlRouterWrapper = urlRouterWrapper;
}
public void DoThings()
{
// ...
_urlRouterWrapper.WrapUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });
// ...
}
}
现在您有了一个易于模拟的界面,IUrlRouterWrapper
您可以尽情地测试它。
我想我找到了一个与您的问题相关的线程:我如何 MOQ System.IO.FileInfo 类...或任何其他没有接口的类?
问题是您不能模拟没有实现接口或将相应的方法/属性设置为虚拟的类。