#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. Спасибо, Дэвид, это имеет большой смысл 🙂