c# - 如何在 Asp.Net Core 2.0 中实例化 UrlHelper 进行 Controller 单元测试

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

我正在为我的 Asp.Net Core 2.0 Controller 编写单元测试。每个 Controller 都注入(inject)了 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);
        });
    }
}

示例 Controller :

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 的工作量将是 Controller 数量 * 操作数量 * 每个操作的链接数量

启动测试服务器

我找到了this MS article关于创建测试服务器。然而,这已经是一个集成测试,我想尽可能长时间地坚持单元测试。如果无法避免启动我当前正在使用的测试服务器,那么我不知道如何从测试服务器获取 UrlHelper 的实例。


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

最佳答案

  1. 您不需要在构造函数中注入(inject) UrlHelper。 ControllerBase.Url 已包含 UrlHelper。
  2. 将您的 hatoas 构建器提取到采用 IUrlHelper 的单独类中,这将降低 Controller 操作的复杂性并使单元测试更容易
  3. 创建一个 stub IUrlHelper 用于对 hatoas 构建器进行单元测试。 stub 相当容易。

关于c# - 如何在 Asp.Net Core 2.0 中实例化 UrlHelper 进行 Controller 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50307933/

相关文章:

python - 如何在运行 Django 测试之前加载测试 yaml 文件?

c# - 选择 XML 节点的内部文本并添加到列表

ruby-on-rails - 为什么这个带有 post 请求的集成测试失败了?

perl - 在 Perl 的单元测试期间提示用户

model-view-controller - MVC Core 从 Controller 操作中设置应用程序文化

.net - 使用 VS2017 在 iisexpress 上部署 ASP.NET 核心 2.0 Web 应用程序导致 HTTP 错误 502.3 - 错误网关

c# - 使用 C# 与 SQL 集成服务对话

c# - 实体 SQL 和 SQL 注入(inject)

c# - 使用 PDFSharp 时访问 Azure Web App 中的字体时出错

asp.net-core-2.0 - OpenCover 覆盖 ASP.Net core 2.0