Как использовать FakeTimeProvider для проверки кода блокировки?C#

Место общения программистов C#
Ответить
Anonymous
 Как использовать FakeTimeProvider для проверки кода блокировки?

Сообщение Anonymous »

Мой код на самом деле выполняет опрос до тех пор, пока не будет достигнуто определенное состояние, например:

Код: Выделить всё

using Microsoft.Extensions.Time.Testing;

namespace TestFramework.Tests.Integration
{
public class Tests
{
FakeTimeProvider timeProvider = new();

[Test]
public void WaitTillWithTimeout_WhenConditionAlwaysFalse_WillTimeoutAsDefined()
{
// Arrange
AutomaticCalendar serviceUsingTimeprovider = new(timeProvider);
var beforeCall = timeProvider.GetTimestamp();

try
{
// Act
WaitTillWithTimeout(serviceUsingTimeprovider, x => false, timeout: TimeSpan.FromDays(365));
// TODO: advance the timeProvider to pass along all the days of the year; timeProvider.Advance(TimeSpan.FromDays(365)); does not work!
}
catch (TimeoutException)
{
// Assert
Assert.That(timeProvider.GetElapsedTime(beforeCall), Is.EqualTo(TimeSpan.FromDays(365)));
}
}

[Test]
public void WaitTillWithTimeout_WhenConditionTrueWithin7Days_WillTimeoutWithin7Days()
{
// Arrange
AutomaticCalendar serviceUsingTimeprovider = new(timeProvider);
var beforeCall = timeProvider.GetTimestamp();

// Act
WaitTillWithTimeout(serviceUsingTimeprovider, x => x.DayOfWeek == "Friday", timeout: TimeSpan.FromDays(365));
// TODO: advance the timeProvider to pass along all the days of the year; timeProvider.Advance(TimeSpan.FromDays(365)); does not work!

// Assert
Assert.That(timeProvider.GetElapsedTime(beforeCall), Is.LessThan(TimeSpan.FromDays(7)));
// TODO Assert that the method does not hang forever
}

private void WaitTillWithTimeout(AutomaticCalendar testCalendar, Predicate computation, TimeSpan timeout)
{
var pollingPeriod = TimeSpan.FromHours(1);

var start = timeProvider.GetTimestamp();
Exception? lastException = null;
bool result = false;
while (timeProvider.GetElapsedTime(start)  DayOfWeek = timeProvider.GetUtcNow().DayOfWeek.ToString(), null, TimeSpan.Zero, TimeSpan.FromHours(1));
}
}
}
}
Я использую Microsoft.Extensions.Time.Testing.FakeTimeProvider в своих сервисных и интеграционных тестах.
Я хочу проверить в моих интеграционных тестах это на самом деле занимает не слишком мало и не слишком много времени.
Выбранное направление решения — использовать TimeProvider, чтобы действительно влиять на прохождение время, как оно отображается в моем коде.
Я попробовал использовать TimeProvider.Advance(...), но затем мне пришлось выполнить этот оператор параллельно с WaitTillWithTimeout(... ).
Как с этим бороться?
Кажется, мне нужно что-то вроде

Код: Выделить всё

// increment the FakeTimeProvider slowly until 3 seconds are passed with increments of 100ms over a period of 1 sec
using(var advancer = TimeAdvancer(_timeprovider, advance:TimeSpan.FromSeconds(3), increment:TimeSpan.FromMilliseconds(100), realtime: TimeSpan.FromSeconds(1)))
{
WaitTillWithTimeout(serviceUsingTimeprovider, x => false, timeout: TimeSpan.FromDays(365));
}

Код: Выделить всё

        private static IDisposable TimeAdvancer(FakeTimeProvider timeProvider, TimeSpan advance, TimeSpan increment)
{
var advancerFunc = () =>
{
for (var time = TimeSpan.Zero; time < advance; time += increment)
{
timeProvider.Advance(increment);
}
};

var cancellationTokenSource = TimeProvider.System.CreateCancellationTokenSource(realtime.Value);
Task.Run(advancerFunc, cancellationTokenSource.Token);

return new MyDisposable(() => {
cancellationTokenSource.Cancel();
});
}
Но вышеописанное не работает, поскольку TimeAdvancer может быть готов до запуска WaitTillWithTimeout.
Может быть кто-нибудь сталкивался с такой же проблемой?

Подробнее здесь: https://stackoverflow.com/questions/789 ... cking-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»