Rx .Net TestScheduler-执行立即安排的事件

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)

这仍然不是我想要的行为,但你去了.

Jam*_*rld 5

您可能想要考虑如何使用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,AdvanceToStart.

你不想做的一般是队列工作,运行一点,排队更多的工作,运行一点 - 特别是如果你没有适当的时间安排.然后你会遇到你在这里遇到的问题.

这并不是说在您的具体情况下这可能是不可避免的 - 例如,如果您需要在特定时间之后决定安排什么,而是考虑是否可以提前设置所有内容,因为它可能会导致更清晰的测试代码更接近于安排法案断言模式.

我尝试通过调度安排,然后通过移动时间,然后断言结果.