Код: Выделить всё
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));
}
}
}
}
Я хочу проверить в моих интеграционных тестах это на самом деле занимает не слишком мало и не слишком много времени.
Выбранное направление решения — использовать 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();
});
}
Может быть кто-нибудь сталкивался с такой же проблемой?
Подробнее здесь: https://stackoverflow.com/questions/789 ... cking-code
Мобильная версия