Ich arbeite mit RX-Scheduler-Klassen mit dem .Schedule(DateTimeOffset, Action>) Zeug. Im Grunde habe ich eine geplante Aktion, die sich selbst wieder planen kann.
Code:
public SomeObject(IScheduler sch, Action variableAmountofTime)
{
this.sch = sch;
sch.Schedule(GetNextTime(), (Action<DateTimeOffset> runAgain =>
{
//Something that takes an unknown variable amount of time.
variableAmountofTime();
runAgain(GetNextTime());
});
}
public DateTimeOffset GetNextTime()
{
//Return some time offset based on scheduler's
//current time which is irregular based on other inputs that i have left out.
return this.sch.now.AddMinutes(1);
}
Meine Frage bezieht sich auf die Simulation der Zeitspanne, die variableAmountofTime benötigen könnte, und auf das Testen, dass sich mein Code wie erwartet verhält und nur den Aufruf wie erwartet auslöst.
Ich habe versucht, die Zeit des Testplaners innerhalb des Delegaten zu verlängern, aber das funktioniert nicht. Beispiel für Code, den ich geschrieben habe und der nicht funktioniert. Angenommen, GetNextTime() ist nur eine Minute aus planen.
[Test]
public void TestCallsAppropriateNumberOfTimes()
{
var sch = new TestScheduler();
var timesCalled = 0;
var variableAmountOfTime = () =>
{
sch.AdvanceBy(TimeSpan.FromMinutes(3).Ticks);
timescalled++;
};
var someObject = new SomeObject(sch, variableAmountOfTime);
sch.AdvanceTo(TimeSpan.FromMinutes(3).Ticks);
Assert.That(timescalled, Is.EqualTo(1));
}
Da ich 3 Minuten in die Zukunft gehen möchte, die Ausführung aber 3 Minuten dauert, möchte ich, dass dies nur 1 Mal ausgelöst wird stattdessen wird es 3 Mal ausgelöst.
Wie kann ich simulieren, dass etwas während der Ausführung Zeit in Anspruch nimmt, wenn ich den Test Scheduler verwende?