Mock HttpRequest en ASP.NET Core Controller
Estoy creando una API web en ASP.NET Core, y quiero probar unitariamente los controladores.
Inyecto una interfaz para acceso a datos, que puedo burlarme fácilmente. Pero el controlador tiene que verificar los encabezados en la Solicitud de un token, y esa Solicitud no parece existir cuando simplemente instancia el controlador yo mismo, y también es get-only, por lo que ni siquiera puedo configurarlo manualmente. Encontré muchos ejemplos para burlarse de un ApiController, pero ese no es el núcleo de .NET. También hay muchos tutoriales y ejemplos de cómo probar los controladores de núcleo .net, pero ninguno de ellos usó HttpRequest.
Construí un MCVE para demostrar esto:
[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());
}
}
Estoy usando Moq y MSTest en mi proyecto de prueba e inyecto un IAccessor burlado. ¿Cómo inyecto la solicitud o la inicializo con el controlador? Supongo que mi último recurso sería la reflexión, pero realmente quiero evitar eso.