Как выполнить юнит-тест контроллера Webapi отправляет ошибку - PullRequest
0 голосов
/ 09 мая 2019

У меня есть следующий метод контроллера:

public IHttpActionResult GetAttractions([FromUri] SearchAttractionRequest request)
{
        try
        {
            var requestParameterType = request.RequestType();

            var searchResultModel = _attractionService.GetAttractions(request);

            return TransformListToResult(searchResultModel.Results, request.PerPage, searchResultModel.TotalItemCount, searchResultModel.GeneratedQuery);
        }
        catch (Exception ex)
        {
          //  return Content(HttpStatusCode.BadRequest, "Any object");
          //  return ResponseMessage(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message));
        }
}

При выполнении запроса request.RequestType (), если переданный параметр недопустим, будет выдано исключение аргумента, и код окажется в блоке catch. У меня есть модульный тест, который я пытаюсь написать:

[Test]
public void Given_Mixed_Parameters_Expect_Error()
{
        var invalidQuery = new SearchAttractionRequest
        {
            Category = Guid.NewGuid().ToString() + "|a catgeory|" + Guid.NewGuid().ToString(),
            Genre = "",
            Region = ""
        };

        var attractionServiceMock = Mock.Of<IAttractionService>();

        var sut = new AttractionsApiController(attractionServiceMock);

        Action act = () => sut.GetAttractions(invalidQuery);

        act.ShouldThrow<HttpResponseException>();
}

Обычно я хочу проверить, что при отправке неверного параметра я получаю ответ об ошибке. Итак, что мне нужно отправить обратно из моего метода API и что мне нужно сделать в моем тесте, чтобы проверить на ошибку. В данный момент я получаю сообщение об ошибке в моем тесте, потому что ожидаемая ошибка - исключение аргумента, и это правильно, но я хочу подражать тому, что получит клиент.

Мне нужно сделать что-то подобное в моем тесте:

as OkNegotiatedContentResult<SomeObject>;

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Вы не можете точно написать тест для контроллера, который будет имитировать то, что получает клиент.Это потому, что по своей сути контроллер - это просто класс с методами, которые возвращают некоторый результат.Технически это не определяет, что получает клиент.

Например, если вы вызываете метод, который выбрасывает необработанное ArgumentException, другое промежуточное программное обеспечение определит, что клиент должен получить ответ 500.Контроллер этого не делает.

Или контроллер может вернуть ViewResult.Клиент не получает ViewResult - он получает HTML.Контроллер не определяет, каким будет этот HTML.

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

Если контроллер выбрасывает необработанное ArgumentException, вы можете проверить это.Если вы обрабатываете ArgumentException и возвращаете

Content(HttpStatusCode.BadRequest, "Any object");`

Вы можете сделать это:

var result = (NegotiatedContentResult<string>)controller.GetResult();
Assert.AreEqual(HttpStatusCode.BadRequest, result.StatusCode);
1 голос
/ 09 мая 2019

Полагаю, вы могли бы использовать следующее:

var attractionServiceMock = Mock.Of<IAttractionService>();

var sut = new AttractionsApiController(attractionServiceMock);

var result = sut.GetAttractions(invalidQuery) as BadRequestErrorMessageResult;
Assert.IsNotNull(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...