我正在使用 ASP.NET Core 构建 Web API,并希望对控制器进行单元测试。
我注入了一个数据访问接口,可以轻松地模拟。但是控制器必须检查请求中的标头是否有令牌,当我手动实例化控制器时,该请求似乎并不存在,而且它也是只读的,所以我甚至无法手动设置它。我发现了许多关于如何模拟 ApiController 的示例,但那不是 .NET core。也有很多关于如何单元测试 .net core 控制器的教程和示例,但没有一个实际使用 HttpRequest。
我构建了一个 MCVE 来演示这一点:
我注入了一个数据访问接口,可以轻松地模拟。但是控制器必须检查请求中的标头是否有令牌,当我手动实例化控制器时,该请求似乎并不存在,而且它也是只读的,所以我甚至无法手动设置它。我发现了许多关于如何模拟 ApiController 的示例,但那不是 .NET core。也有很多关于如何单元测试 .net core 控制器的教程和示例,但没有一个实际使用 HttpRequest。
我构建了一个 MCVE 来演示这一点:
[Produces("application/json")]
[Route("api/Players")]
public class PlayersController : Controller
{
private IAccessor accessor;
public PlayersController(IAccessor ac = null):base()
{
accessor = ac ?? AccessorFactory.GetAccessor();
}
/// <summary>
/// Get all players. Must be logged in.
/// </summary>
/// <returns>Ok or Unauthorized.</returns>
[HttpGet]
public IActionResult Get()
{
Player client = accessor.GetLoggedInPlayer(Request.Headers["token"]); // NRE here because Request is null
if (client == null) return Unauthorized();
return Ok(accessor.GetAllPlayers());
}
}
我在我的测试项目中使用Moq和MSTest,并注入了一个被mock的IAccessor。我该如何注入请求,或通过控制器初始化它?我猜最后的办法是反射, 但我真的想避免这种情况。