【发布时间】:2018-10-11 12:10:48
【问题描述】:
我正在 ASP.NET Core 中构建一个 Web API,我想对控制器进行单元测试。
我为数据访问注入了一个接口,我可以轻松地模拟它。但是控制器必须检查请求中的标头以获得令牌,当我自己简单地实例化控制器时,该请求似乎不存在,而且它也是仅获取的,所以我什至无法手动设置它。我发现了很多模拟 ApiController 的示例,但这不是 .NET 核心。还有许多关于如何对 .net 核心控制器进行单元测试的教程和示例,但没有一个真正使用 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,并注入一个模拟的 IAccessor。如何注入请求,或使用控制器对其进行初始化?我想我最后的手段是反思,但我真的想避免这种情况。
【问题讨论】:
标签: c# unit-testing asp.net-core moq asp.net-core-webapi