Вынесите текущее время и реальный запуск во внедряемые зависимости. Тогда тест проверит граничные часы и факт вызова без ожидания и опасных побочных эффектов.
Проверка поведения метода LaunchRockets
Вынесите текущее время и реальный запуск во внедряемые зависимости. Тогда тест проверит граничные часы и факт вызова без ожидания и опасных побочных эффектов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Как написать юнит‑тест для метода LaunchRockets, при этом допускается менять структуру кода: добавлять, удалять или изменять его части.
public class Defender
{
private RocketService rocketService;
public Defender()
{
rocketService = new RocketService();
}
public void Start()
{
rocketService.LaunchRockets();
}
}
public class RocketService
{
public void LaunchRockets()
{
if (DateTime.Now.Hour > 10)
{
// реализация запуска ракет
}
}
}
Ответ
Вынесите текущее время и реальный запуск во внедряемые зависимости. Тогда тест проверит граничные часы и факт вызова без ожидания и опасных побочных эффектов.
Минимальный вариант тестируемой логики:
public sealed class RocketService(Func<DateTime> now, Action launch)
{
public void LaunchRockets()
{
if (now().Hour > 10) launch();
}
}
// Тест без реального запуска:
int calls = 0;
var service = new RocketService(
() => new DateTime(2026, 1, 1, 11, 0, 0), () => calls++);
service.LaunchRockets();
Assert.Equal(1, calls);
Отдельные тесты для 10:00 и 10:59 ожидают ноль вызовов: условие >10 начинает выполняться с 11:00. Defender также должен получать сервис через конструктор, а не создавать его сам. Часовой пояс бизнес-правила нужно зафиксировать явно.