Я строю веб-API в ASP.NET Core и хочу провести модульное тестирование контроллеров.
Я ввожу интерфейс для доступа к данным, который легко подделать. Но контроллер должен проверить заголовки в Запросе на токен, и этот Запрос, кажется, не существует, когда я сам создаю экземпляр контроллера, и это также только для получения, поэтому я даже не могу установить его вручную. Я нашел много примеров, чтобы издеваться над 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. Как ввести запрос или инициализировать его с помощью контроллера? Я думаю, что моим последним средством было бы отражение, но я действительно хочу избежать этого.