Sobes.tech
Back to questions
Middle+
8

Ревью: тест CalendarService.cs: public class CalendarService { public bool IsWorkingDay() { switch (DateTime.Now.DayOfWeek) { case DayOfWeek.Saturday: case DayOfWeek.Sunday: return false; default: return true; } } } CalendarServiceTests.cs: public class CalendarServiceTests { [Fact] public void IsWorkingDay_Always_ReturnsTrue() { // Arrange var calendarService = new CalendarService(); // Act var actual = calendarService.IsWorkingDay(); // Assert Assert.True(actual); } }

Companies where asked
Gravilink

Answer from AI

sobes.tech AI

В данном тесте есть критическая ошибка: метод IsWorkingDay зависит от текущей даты (DateTime.Now), а тест всегда ожидает true, что неверно для выходных дней.

Чтобы сделать тест корректным и надежным, нужно:

  1. Внедрить зависимость времени (например, через интерфейс IDateTimeProvider), чтобы можно было подставлять фиксированное время в тестах.
  2. Написать несколько тестов для разных дней недели, проверяя корректность работы метода.

Пример улучшенного кода:

public interface IDateTimeProvider
{
    DateTime Now { get; }
}

public class SystemDateTimeProvider : IDateTimeProvider
{
    public DateTime Now => DateTime.Now;
}

public class CalendarService
{
    private readonly IDateTimeProvider _dateTimeProvider;

    public CalendarService(IDateTimeProvider dateTimeProvider)
    {
        _dateTimeProvider = dateTimeProvider;
    }

    public bool IsWorkingDay()
    {
        switch (_dateTimeProvider.Now.DayOfWeek)
        {
            case DayOfWeek.Saturday:
            case DayOfWeek.Sunday:
                return false;
            default:
                return true;
        }
    }
}

Тест:

public class FakeDateTimeProvider : IDateTimeProvider
{
    public DateTime Now { get; set; }
}

public class CalendarServiceTests
{
    [Theory]
    [InlineData(DayOfWeek.Monday, true)]
    [InlineData(DayOfWeek.Saturday, false)]
    [InlineData(DayOfWeek.Sunday, false)]
    public void IsWorkingDay_ReturnsExpectedResult(DayOfWeek day, bool expected)
    {
        var fakeProvider = new FakeDateTimeProvider { Now = new DateTime(2023, 1, 2).AddDays((int)day - 1) };
        var service = new CalendarService(fakeProvider);

        var result = service.IsWorkingDay();

        Assert.Equal(expected, result);
    }
}

Такой подход делает тесты детерминированными и покрывает разные сценарии.