如何在Asp.Net Core 2.0中实例化UrlHelper以进行控制器单元测试

时间:2018-05-12 15:37:00

标签: c# unit-testing asp.net-core-2.0

我正在为我的Asp.Net Core 2.0控制器编写单元测试。每个控制器都注入一个IUrlHelper服务,以便于创建Hateoas链接。此服务在Startup类的ConfigureServices方法中注册。这是我的Startup类的快照:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
        services.AddScoped<IUrlHelper, UrlHelper>(implementationFactory =>
        {
            var actionContext = 
                implementationFactory.GetService<IActionContextAccessor>()
                .ActionContext;
            return new UrlHelper(actionContext);
        });
    }
}

样本控制器:

using Microsoft.AspNetCore.Mvc;

public class MyApiController : Controller
{
    private readonly IUrlHelper _urlHelper;

    public MyApiController(IUrlHelper urlHelper)
    {
        _urlHelper = urlHelper;
    }

    // At least 5 actions and each requires _urlHelper to create Hateoas links
}

我遇到困难的是我不知道如何在单元测试类中初始化UrlHelper类。

到目前为止我尝试过:

嘲笑UrlHelper

我找到this article,但我更喜欢模拟UrlHelper服务,而是将其初始化为正在测试的真实API,因为模拟需要花费太多精力才能写出所有模拟路径。测试我的整个API的工作将是控制器数量 * 操作数量 * 每个操作的链接数

启动TestServer

我在创建TestServer时发现了this MS article。但是,这已经是一个集成测试,我想尽可能坚持单元测试。如果没有办法避免启动我正在玩的测试服务器,那么我不知道如何从测试服务器获取UrlHelper的实例。

有没有办法在我的测试类中为测试中的API获取UrlHelper实例,最好不启动测试服务器,如果测试服务器不可避免,我如何从测试服务器获取UrlHelper实例?

1 个答案:

答案 0 :(得分:1)

  1. 您不需要在构造函数中注入UrlHelper。 ControllerBase.Url已经包含UrlHelper。
  2. 将仇恨构建者提取到带有IUrlHelper的单独的类中,这将降低控制器操作的复杂性并使单元测试更容易
  3. 创建存根IUrlHelper,以对Hatoss构建器进行单元测试。存根很容易。