Макет HttpRequest в ASP.NET Core Controller - PullRequest
0 голосов
/ 01 мая 2018

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

1 Ответ

0 голосов
/ 01 мая 2018

При создании экземпляра тестируемого контроллера обязательно назначьте HttpContext, который содержит необходимые зависимости для выполнения теста до его завершения.

Вы можете попробовать создать HttpContext и предоставить его контроллеру или просто использовать DefaultHttpContext, предоставляемый фреймворком

//Arrange
var mockedAccessor = new Mock<IAccessor>();
//...setup mockedAccessor behavior

//...

var httpContext = new DefaultHttpContext(); // or mock a `HttpContext`
httpContext.Request.Headers["token"] = "fake_token_here"; //Set header
 //Controller needs a controller context 
var controllerContext = new ControllerContext() {
    HttpContext = httpContext,
};
//assign context to controller
var controller = new PlayersController (mockedAccessor.Object){
    ControllerContext = controllerContext,
};

//Act
var result = controller.Get();

//...

Вышеприведенное предполагает, что вы уже знаете, как имитировать зависимости контроллера, например IAccessor, и предназначено для демонстрации того, как предоставить специфичные для платформы зависимости, необходимые для теста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...