Выбор ответа Senior Тестирование обновлено
Тестирование кода с текущим временем
Вопрос
Метод проверяет, истекла ли подписка, через DateTime.UtcNow. Как сделать его тестируемым в .NET 8?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Внедрить TimeProvider, а в тестах взять FakeTimeProvider. В .NET 8 появился абстрактный TimeProvider (TimeProvider.System в проде), а пакет Microsoft.Extensions.TimeProvider.Testing даёт FakeTimeProvider с Advance.
Варианты ответа
- Подменить системное время на машине CI перед прогоном тестов
- Добавить
Thread.Sleepв тест, чтобы дождаться нужного времени - Внедрить
TimeProvider, а в тестах взятьFakeTimeProviderправильный ответ - Мокнуть статическое свойство
DateTime.UtcNowчерез Moq
Разбор
В .NET 8 появился абстрактный TimeProvider (TimeProvider.System в проде), а пакет Microsoft.Extensions.TimeProvider.Testing даёт FakeTimeProvider с Advance. До этого писали свой IClock. Менять время на CI ненадёжно, Sleep делает тесты медленными и хрупкими. Moq не умеет мокать статические свойства вроде DateTime.UtcNow.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.