Sobes.tech
Middle+

Ревью: тест 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); } }

sobes.tech AI

Answer from AI

This test has a critical flaw: the IsWorkingDay method depends on the current date (DateTime.Now), and the test always expects true, which is incorrect for weekends.

To make the test correct and reliable, you should:

  1. Inject a time dependency (for example, via the IDateTimeProvider interface) to allow setting a fixed time in tests.
  2. Write several tests for different days of the week to verify the method's correctness.

Example of improved code:

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;
        }
    }
}

Test:

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);
    }
}

This approach makes the tests deterministic and covers different scenarios.