我正在为我的 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 实例?
最佳答案
- 您不需要在构造函数中注入(inject) UrlHelper。 ControllerBase.Url 已包含 UrlHelper。
- 将您的 hatoas 构建器提取到采用 IUrlHelper 的单独类中,这将降低 Controller 操作的复杂性并使单元测试更容易
- 创建一个 stub IUrlHelper 用于对 hatoas 构建器进行单元测试。 stub 相当容易。
关于c# - 如何在 Asp.Net Core 2.0 中实例化 UrlHelper 进行 Controller 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50307933/