gpt4 book ai didi

c# - 基本 RX TestScheduler 时序

转载 作者:行者123 更新时间:2023-11-30 18:34:20 29 4
gpt4 key购买 nike

我正在使用 RX 进行一些(非常基本的)事件订阅:-

public void StartListening(IObservable<Item> observable)
{
subscription = observable
.Buffer(TimeSpan.FromSeconds(5))
.Where(Enumerable.Any)
.Subscribe(events => service.DoStuffInBatch(events));
}

现在我只需要一组单元测试来证明此方法的行为。像这样的东西:-

  • 如果我得到数据但时间还没有过去 5 秒,我们永远不会调用 DoStuffInBatch。
  • 如果我获得数据并且时间已过 5 秒,我将使用数据调用 DoStuffInBatch。
  • 如果我没有获取数据并且时间已过 5 秒,我不会调用 DoStuffInBatch。
  • 如果我通过两个窗口获取数据,例如有些在 3 秒,有些在 8 秒,我两次调用 DoStuffInBatch。

我一直在通读 Bart 提出的所有示例(例如 http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx ),但我真的在为我的测试而苦苦挣扎。这是一个例子:-

[Test]
public void StartListening_SomeDataAndBatchTimeHasNotPassed_DoesNotDoStuffInBatch()
{
var scheduler = new TestScheduler();

// Act - call the class under test, supplying a set of dummy data on the test scheduler
listener.StartListening(GenerateTestData(5).ToObservable(scheduler));

// Move the scheduler forward by one second
scheduler.AdvanceBy(TimeSpan.FromSeconds(1).Ticks);

// Assert that we never called the service as we haven't yet advanced 5 seconds
Mock.Assert(() => mockService.DoStuffInBatch(null), Args.Ignore(), Occurs.Never());
}

但是,这个测试失败了。我一调用 AdvanceBy,订阅就会触发并调用 DoStuffInBatch。

我显然做错了什么 - 但不知道我做错了什么。

最佳答案

也许您可以尝试将 IScheduler 参数传递给 StartListening 方法,并使用它将 TestScheduler 实例传递给 .Buffer() ,还是调用 .SubscribeOn()?

在运行时,您只需默认为任何对您的情况敏感的默认值。

关于c# - 基本 RX TestScheduler 时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201249/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com