Издевательство над HttpContext.Session в .NET Core

#c# #.net #unit-testing #asp.net-core

#c# #.net #модульное тестирование #asp.net-core

Вопрос:

Я использую xUnit с Moq для написания модульных тестов для своего приложения. Однако мне трудно издеваться над сеансом.

Тестируемая система — это действие контроллера, тестируемый метод использует a TempData["UserMessage"] , который всегда равен null, поскольку сеанс не инициализирован.

Это печатный экран того, как я пытаюсь издеваться над зависимостью. введите описание изображения здесь

Выданная ошибка находится в строке 65 и выглядит следующим образом
введите описание изображения здесь

Комментарии:

1. Контроллеры должны быть немыми, вместо этого вы должны иметь сервис и тестировать их.

2. У меня есть службы, в которых я храню свою логику. Вы имеете в виду, что его вообще не следует тестировать? Я намеревался проверить, вернул ли он правильное сообщение пользователя при отправке ошибок / правильных значений.

3. Вы просто проверяете, что фреймворк делает свое дело, я обычно стараюсь этого избегать.

4. Я пытаюсь переварить то, что вы пишете, но я не понимаю, почему я не должен проверять, что наши действия выполняют различные вызовы методов обслуживания в правильном порядке и т. Д. Есть ли у вас какая-либо ссылка на то, что вы предлагаете? Мне действительно интересно, насколько тонкими / глупыми они должны быть.

5. Извините за задержку … ответил на это

Ответ №1:

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

 public class MyThinController : Controller
{
    [
        HttpGet,
        Route("api/[controller]/foos/{bar}"),
        Authorize(Policy = nameof(Policies.StackoverflowOp))
    ]
    public Task<IActionResult> GetFoo([FromRoute] Bar bar,
                                      [FromServices] IExampleService service)
        => service.GetAsync(bar);
}
  

Тогда ваша единственная забота должна заключаться в том, что при условии a bar реализация IExampleService правильно получает a Foo .

Но если вы совершенно не хотите делать это правильно, всегда есть способ сделать это неправильно. На самом деле вы ищете тот ActionContext.HttpContext , который готов к moq.

Комментарии:

1. Спасибо, Дэвид, это имеет большой смысл 🙂