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, что неверно для выходных дней.
Чтобы сделать тест корректным и надежным, нужно:
- Внедрить зависимость времени (например, через интерфейс IDateTimeProvider), чтобы можно было подставлять фиксированное время в тестах.
- Написать несколько тестов для разных дней недели, проверяя корректность работы метода.
Пример улучшенного кода:
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);
}
}
Такой подход делает тесты детерминированными и покрывает разные сценарии.