Mat*_*age 2 .net c# system.reactive
当我这样做:
testScheduler.Schedule("Hello world",(scheduler, state) => Console.WriteLine(state));
testScheduler.AdvanceTo(testScheduler.Now);
Run Code Online (Sandbox Code Playgroud)
我点击此代码VirtualTimeSchedulerBase:
public void AdvanceTo(TAbsolute time)
{
int num = this.Comparer.Compare(time, this.Clock);
if (num < 0)
throw new ArgumentOutOfRangeException("time");
if (num == 0)
return;
Run Code Online (Sandbox Code Playgroud)
num == 0 是的,我退出方法.
我可以打电话testScheduler.Start(),我的行动将会执行.但随后TestScheduler将继续执行其队列中的所有内容.而我希望它在当前时间停止执行操作.
我在TestScheduler上看不到任何其他方法可以让我获得我想要的行为.
这是一个错误,还是正确的行为,但我错过了什么?
编辑:
我误解了.TestScheduler直到它们被安排的日期之后才执行操作.
调度操作会立即将其调度为当前值testScheduler.Now.所以直到它才会被执行Now + 1.
var testScheduler = new TestScheduler();
var due = new DateTime();
testScheduler.Schedule("Hello world", due, (scheduler, s) =>
{
Console.WriteLine(s);
return Disposable.Empty;
});
testScheduler.AdvanceTo(due.Ticks);
// Nothing has happened
testScheduler.AdvanceTo(due.Ticks+1);
// -> "Hello world"
Run Code Online (Sandbox Code Playgroud)
这仍然不是我想要的行为,但你去了.
您可能想要考虑如何使用TestScheduler:
它通常会在适当的时候执行.例如,此代码将写入控制台:
var scheduler = new TestScheduler();
scheduler.Schedule(
TimeSpan.FromTicks(100),
() => Console.WriteLine("Hello"));
scheduler.AdvanceTo(100);
Run Code Online (Sandbox Code Playgroud)
但是,TestScheduler只有在移动时间时才会检查它的队列.因此,如果您安排某个操作,则需要移动时间AdvanceBy,AdvanceTo或者Start让它来处理队列.如果是这样,它将处理所有内容到当前时间.例如,即使按照"过去"安排,这将输出到控制台:
var scheduler = new TestScheduler();
scheduler.AdvanceTo(TimeSpan.FromTicks(100).Ticks);
scheduler.Schedule(
DateTime.MinValue + TimeSpan.FromTicks(50),
() => Console.WriteLine("Hello"));
Console.WriteLine("No output until the scheduler is given time...");
scheduler.AdvanceBy(1);
Run Code Online (Sandbox Code Playgroud)
习惯使用TestScheduler通常包括排队所有工作,然后通过Start()调用运行完成,然后检查预期状态.使用AdvanceBy,AdvanceTo往往是在您需要测试一些中间状态更为苛刻的测试场景-即使如此,你一般排队一切适当的时间适当的,然后先上去AdvanceBy或者AdvanceTo你感兴趣的时候,检查状态,然后再进步AdvanceBy,AdvanceTo或Start.
你不想做的一般是队列工作,运行一点,排队更多的工作,运行一点 - 特别是如果你没有适当的时间安排.然后你会遇到你在这里遇到的问题.
这并不是说在您的具体情况下这可能是不可避免的 - 例如,如果您需要在特定时间之后决定安排什么,而是考虑是否可以提前设置所有内容,因为它可能会导致更清晰的测试代码更接近于安排法案断言模式.
我尝试通过调度安排,然后通过移动时间,然后断言结果.