Skip to content

Instantly share code, notes, and snippets.

@kant2002
Last active January 31, 2022 19:41
Show Gist options
  • Save kant2002/af0a40df10c154eaa4a84f64ce2a9d60 to your computer and use it in GitHub Desktop.
Save kant2002/af0a40df10c154eaa4a84f64ce2a9d60 to your computer and use it in GitHub Desktop.
Тестирование времени в C#
void EnrichRequest(Request request)
{
var days = configurationService.GetValidDurationInDays();
request.ValidTo = request.ValidTo ?? DateTime.Now.AddDays(days);
}
// Супер легко использовать
EnrichRequest(request);
/*
Предполагаемо тестируемые сценарии
1. время жизни запроса указано
2. время жизни запроса не указано и количество дней в конфигурации задано
3. время жизни запроса не указано и количество дней в конфигурации не задано.
*/
// Чтобы протестировать надо сделать 2 мока.
// каждый мок просто будет добавлять в тест кучу кода который будет путать
// что собственно тест делает.
void RequestLifetimeSet()
{
var configurationService = Mock<IConfigurationService>().Configure(_ => GetValidDurationInDays = () => 5));
// опуская в сторону как конкретно деляются моки и какой библиотекой.
DateTimeMock.Now = () => DateTime.Parse("2022-02-01 01:24:10"));
var request = new Request() { ValidTo = DateTime.Parse(DateTime.Parse("2022-02-02 00:00:00")) };
EnrichRequest(request);
Assert.Equals(DateTime.Parse("2022-02-02 00:00:00"), request.ValidTo);
}
// вы не будете тестировать данный код.
// тут можно только протестировать что конфигурационный сервис таки вызвали.
// как мне кажется это уже проще тестировать интеграционно с другими способами.
void EnrichRequest(Request request)
{
var days = configurationService.GetValidDurationInDays();
EnrichRequest(request, days, DateTime.Now);
}
// тестироваться будет только этот.
void EnrichRequest(Request request, int defaultLifetimeDays, DateTime currentTime)
{
var days = configurationService.GetValidDurationInDays();
request.ValidTo = request.ValidTo ?? defaultLifetimeDays.AddDays(days);
}
// Можно также легко использовать
EnrichRequest(request);
/*
Предполагаемо тестируемые сценарии
1. время жизни запроса указано
2. время жизни запроса не указано и количество дней в конфигурации задано
3. время жизни запроса не указано и количество дней в конфигурации не задано.
*/
// Чтобы протестировать надо сделать 2 мока.
// каждый мок просто будет добавлять в тест кучу кода который будет путать
// что собственно тест делает.
void RequestLifetimeSet()
{
// магии моков нет, и остались только утверждения который хорошо транслируются в то как заказчик/менеджер их говорит.
// запрос который дейстителен до полуночи 2 февраля 2022г.
var request = new Request() { ValidTo = DateTime.Parse("2022-02-02 00:00:00")) };
// обрабатывая запрос при длительности жизни по умолчанию 5 дней, в час ночи, 24 минуты 10 секунд 1 февраля 2022г.
EnrichRequest(request, defaultLifetimeDays: 5, currentTime: DateTime.Parse("2022-02-01 01:24:10"));
// запрос действителен до полуночи 2 февраля 2022г.
Assert.Equals(DateTime.Parse("2022-02-02 00:00:00"), request.ValidTo);
}
// чуть меньше церемонии в формировании тестов, чуть больше акцента на том что тесты делают.
// из минусов то что я на одну функцию больше написал.
// конкретно такую логику конечно вообще не так разбить на функции, но это уже другое.
// как мне кажется важно чтобы тесты максимально походили на язык спеки, и минимум обвязки.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment