【问题标题】:Need to Mock Url.RouteUrl for Unit Test需要模拟 Url.RouteUrl 进行单元测试
【发布时间】:2013-06-30 22:35:43
【问题描述】:

我的控制器/操作中有以下代码行

var defaultRoute = Url.RouteUrl("Default", new { action = "MyAction", controller = "MyController", id = 1 });

我正在编写一个单元测试,需要模拟这一行以使其返回一些 URL。我不知道我怎么能这样做。谁能帮我为这条线写一个测试。

谢谢

【问题讨论】:

  • 解决方法是什么?如何让我的单元测试忽略 Url.RouteUrl 行

标签: asp.net-mvc unit-testing


【解决方案1】:

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

问题是您不能模拟没有实现接口或将相应的方法/属性设置为虚拟的类。

【讨论】:

  • 解决方法是什么?如何让我的单元测试忽略 Url.RouteUrl 行
【解决方案2】:

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

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,您可以尽情地测试它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2013-11-12
    • 2018-11-21
    • 2018-10-19
    • 2013-07-24
    相关资源
    最近更新 更多