- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个测试代码的例子:
[Fact]
public void Should_only_contain_most_recent() {
var window = TimeSpan.FromMilliseconds(200);
var results = new ReplaySubject<long>(window);
results.OnNext(1);
results.OnNext(2);
System.Threading.Thread.Sleep(50);
results.OnNext(3);
System.Threading.Thread.Sleep(50);
results.OnNext(4);
System.Threading.Thread.Sleep(200);
results.OnNext(5);
results.OnCompleted();
var items = results.ToEnumerable();
Assert.True(items.SequenceEqual(new long [] { 5 }));
}
我想把它变成使用 Microsoft.Reactive.Testing 包中的 TestScheduler,因为我想摆脱这里的 sleep 。
我已经尝试过这样做了。
[Fact]
public void Should_only_contain_most_recent() {
var scheduler = new TestScheduler();
var window = TimeSpan.FromMilliseconds(200);
var results = new ReplaySubject<long>(window /* Never finishes when add the scheduler here.*/);
results.OnNext(1);
results.OnNext(2);
scheduler.Schedule(TimeSpan.FromMilliseconds(50), () => results.OnNext(3));
scheduler.Schedule(TimeSpan.FromMilliseconds(50), () => results.OnNext(4));
scheduler.Schedule(TimeSpan.FromMilliseconds(200), () => results.OnNext(5));
scheduler.Schedule(TimeSpan.FromMilliseconds(210), results.OnCompleted);
scheduler.Start();
var items = results.ToEnumerable();
Assert.True(items.SequenceEqual(new long[] { 5 }));
}
但是我错过了一些东西。
最佳答案
推测您正在尝试测试 ReplaySubject 的重放行为。问题是您需要启动 TestScheduler 两次。它只运行到所有计划的事件都已执行 - 但我们需要在没有任何订阅者的情况下加载 ReplaySubject
以便它具有将重播的事件 - 然后在订阅者连接后再次运行调度程序。
这是编写此测试的惯用方法:
首先,我用我们需要的事件设置source
。通过从 ReactiveTest
派生测试类,您可以利用 OnXXX 辅助方法更轻松地创建源事件。
准备好源流后,我们可以订阅 ReplaySubject
并在 TestScheduler
上调用 Start
。这将运行虚拟时间直到最后一个预定事件 (T=300ms) - 我通过转储超时来演示。
现在我们使用 TestScheduler
的 CreateObserver
方法为结果创建记录器并将其订阅到 ReplaySubject
。
现在我们再次启动 TestScheduler
- 这会从 T=300ms 开始计时,直到刷新新生成的计划事件。这些是 ReplaySubject
需要重播的事件 - 那些在 200 毫秒窗口内的事件。请注意,这些将在 T=300 毫秒 + 1 个滴答、+ 2 个滴答和 + 3 个滴答时发出 - 这是因为 TestScheduler
具有 1 个滴答的分辨率。
代码如下:
public class MyTests : ReactiveTest
{
[Fact]
public void Should_only_contain_most_recent()
{
var scheduler = new TestScheduler();
var source = scheduler.CreateHotObservable(
OnNext(0, 1),
OnNext(0, 2),
OnNext(TimeSpan.FromMilliseconds(50).Ticks, 3),
OnNext(TimeSpan.FromMilliseconds(100).Ticks, 4),
OnNext(TimeSpan.FromMilliseconds(300).Ticks, 5),
OnCompleted(TimeSpan.FromMilliseconds(300).Ticks, witness: 0));
var replaySubject = new ReplaySubject<int>(
TimeSpan.FromMilliseconds(200), scheduler);
source.Subscribe(replaySubject);
scheduler.Start();
/* the test scheduler is now at 300 milliseconds
* and the ReplaySubject is loaded */
Console.WriteLine(scheduler.Now.Ticks);
var results = scheduler.CreateObserver<int>();
replaySubject.Subscribe(results);
/* run the scheduler on to flush the events from the ReplaySubject */
scheduler.Start();
results.Messages.AssertEqual(
OnNext(TimeSpan.FromMilliseconds(300).Ticks + 1, 4),
OnNext(TimeSpan.FromMilliseconds(300).Ticks + 2, 5),
OnCompleted(TimeSpan.FromMilliseconds(300).Ticks + 3, witness: 0));
}
}
关于c# - 如何将 TestScheduler 与 ReplaySubject 时间窗一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25102256/
我创建了以下辅助方法来协助测试可观察对象: public static void ExecuteObservableTest(IObservable observable, Action ac
我正在测试单个用例。但是测试观察者不会在测试环境中发出任何东西。 即使我将 subscribeOn() 从 Schedulers.newThread() 更改为TestScheduler() 仍然测试
根据一些评论,我应该明确表示这个问题是关于为什么 TestScheduler 会抛出空引用异常,而不是如何让测试通过。一个较早的示例假定与 TPL 的交互是问题的原因,但我现在发现这不是触发行为所必需
我正在尝试测试一个函数,其中流的元素在延迟后一个接一个地分派(dispatch),我能够使用 Thread.sleep 使我的测试工作。但是,当我使用 TestScheduler.advanceTim
当我这样做时: testScheduler.Schedule("Hello world",(scheduler, state) => Console.WriteLine(state)); testSc
我对 rx/ReactiveUi 非常陌生,想使用 TestScheduler 编写一个 xunit 测试来检查检索搜索建议的限制是否正常工作。 想法是使用 TestScheudler 进行计时,更改
我正在使用 RX 进行一些(非常基本的)事件订阅:- public void StartListening(IObservable observable) { subscription = ob
我试图让 Jasmine、promises 和 Rx.TestScheduler 一起很好地发挥作用,但我遇到了一个似乎无法解决的障碍。 我想要实现的是使用 RxJs 和 Jasmine 测试延迟 p
我正在尝试在 Kotlin 中使用 RxJava 在 MVP 架构中测试我的演示者。我创建了一个测试规则,用 TestScheduler 替换常用的调度程序,以便能够测试异步请求: class Tes
我正在尝试了解如何在 C# 中实现以下目标 我有这个类的列表 public class StockTickerChangeHistory { public DateTime Time;
我正在尝试在测试中使用带有异步方法的 reactiveui 测试调度程序。 等待异步调用时测试挂起。 根本原因似乎是在异步方法中等待的命令。 [Fact] public async T
我一直面临主题和 TestScheduler 的问题。如果我使用 Trampoline 调度程序,我的测试会通过,但由于某种原因,如果我使用 TestScheduler,测试会失败。 这是我的示例测试
这很愚蠢,但我似乎找不到包含 TestScheduler 的 .net rx nuget 包 请指出正确的方向。 最佳答案 TestScheduler 在 Microsoft.Reactive.Tes
所以我正在尝试在使用 Akavache 的应用程序中测试缓存行为。我的测试看起来像这样: using Akavache; using Microsoft.Reactive.Testing; using
我有一个测试代码的例子: [Fact] public void Should_only_contain_most_recent() { var window = Tim
我正在尝试在 RxJs 版本 5 中使用 Observable.interval 编写示例单元测试。我正在运行以下代码,但我的 observable 只触发一次,而不是预期的 20 次. it('do
我想编写一个单元测试来验证下面的 callInit 方法。但是,我在该行包含 subscribe( 的地方遇到了空指针异常。我的问题是如何在下面的方法中验证 onnext 和 onerror 条件?
tl;dr 是否可以在不重写的情况下对这段代码进行单元测试? http://jsbin.com/jezosegopo/edit?js,console const keyUpObserver = ($i
我想检查我创建的 IObservable 是否尊重“完成后,我将取消订阅你” 的礼貌。乍一看,我的代码似乎有问题。但是删除我的代码,只使用 TestScheduler 提供的 Observable 和
我是 ReactiveUI 的新手。我有以下简单设置:可以指定 csv 的路径,并将包含的数据点显示给用户(使用 oxyplot)。现在我正在尝试测试以下订阅: public GraphViewMod
我是一名优秀的程序员,十分优秀!