【问题标题】:How to instantiate UrlHelper for a Controller Unit Test in Asp.Net Core 2.0如何在 Asp.Net Core 2.0 中为控制器单元测试实例化 UrlHelper
【发布时间】:2018-05-12 15:37:00
【问题描述】:

我正在为我的 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 时发现了 this MS article。但是,这已经是一个集成测试,我想尽可能长时间地坚持单元测试。如果无法避免启动我目前正在使用的测试服务器,那么我不知道如何从测试服务器获取 UrlHelper 的实例。


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

【问题讨论】:

  • 不!!。您可以模拟 IUrlHelper 以进行独立的单元测试,或者在与测试服务器的集成测试中构建整个对象图。

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


【解决方案1】:
  1. 您不需要在构造函数中注入 UrlHelper。 ControllerBase.Url 已包含 UrlHelper。
  2. 将您的 hatoas 构建器提取到采用 IUrlHelper 的单独类中,这将降低控制器操作的复杂性并使单元测试更容易
  3. 创建一个存根 IUrlHelper 用于对 hatoas 构建器进行单元测试。存根相当容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 2021-01-24
    • 2018-09-29
    • 2018-05-01
    • 2017-03-22
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    相关资源
    最近更新 更多