需要模拟Url.RouteUrl进行单元测试

时间:2013-06-30 22:35:43

标签: asp.net-mvc unit-testing

我在Controller / Action

中有以下代码行
var defaultRoute = Url.RouteUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });

我正在编写单元测试并需要模拟此行以使其返回一些URL。我不知道我怎么能这样做。任何人都可以帮我写一个测试线。

感谢

2 个答案:

答案 0 :(得分:0)

我想我找到了与您的问题相关的帖子:How do I MOQ the System.IO.FileInfo class... or any other class without an interface?

问题在于,您无法模拟未实现接口的类或将相应的方法/属性设置为virtual。

答案 1 :(得分:0)

您总是可以为不可测试的类创建一个包装类,然后模拟:

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,你可以根据自己的内容进行测试。