Выбор ответа Senior Тестирование обновлено

Тестирование кода с текущим временем

Вопрос

Метод проверяет, истекла ли подписка, через DateTime.UtcNow. Как сделать его тестируемым в .NET 8?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Внедрить TimeProvider, а в тестах взять FakeTimeProvider. В .NET 8 появился абстрактный TimeProvider (TimeProvider.System в проде), а пакет Microsoft.Extensions.TimeProvider.Testing даёт FakeTimeProvider с Advance.

Варианты ответа

  1. Подменить системное время на машине CI перед прогоном тестов
  2. Добавить Thread.Sleep в тест, чтобы дождаться нужного времени
  3. Внедрить TimeProvider, а в тестах взять FakeTimeProviderправильный ответ
  4. Мокнуть статическое свойство DateTime.UtcNow через Moq

Разбор

В .NET 8 появился абстрактный TimeProvider (TimeProvider.System в проде), а пакет Microsoft.Extensions.TimeProvider.Testing даёт FakeTimeProvider с Advance. До этого писали свой IClock. Менять время на CI ненадёжно, Sleep делает тесты медленными и хрупкими. Moq не умеет мокать статические свойства вроде DateTime.UtcNow.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме