Проверка поведения метода 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 также должен получать сервис через конструктор, а не создавать его сам. Часовой пояс бизнес-правила нужно зафиксировать явно.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее