- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想检查我创建的 IObservable
是否尊重“完成后,我将取消订阅你” 的礼貌。乍一看,我的代码似乎有问题。但是删除我的代码,只使用 TestScheduler 提供的 Observable 和 Observer,看起来“取消订阅”永远不会发生:
using Microsoft.Reactive.Testing;
using System.Reactive;
...
var ts = new TestScheduler();
var ob = ts.CreateObserver<int>();
var xs = ts.CreateColdObservable<int>(
new Recorded<Notification<int>>(1, Notification.CreateOnCompleted<int>())
);
xs.Subscribe(ob);
ts.AdvanceTo(2);
Assert.Equal(1, xs.Subscriptions.Single().Unsubscribe); //<-- Xunit no like
我最初怀疑观察者,但我在找到的代码变体上尝试了 here ,并且它有效,所以现在我认为 ColdObservable
上的 Subscribe
的实现行为不正常。
最佳答案
不存在这样的礼貌。 RX design guideines在第 4.3 节中建议您可以:
Assume resources are cleaned up after an OnError or OnCompleted message.
在 4.4 节中说你可以:
Assume a best effort to stop all outstanding work on Unsubscribe
这些指南(“礼貌”)讨论了运营商尽快释放自己的资源以及已获得的资源。
在您的代码中,您没有针对这两种情况进行测试。 Unsubscribe
的目的ITestableObservable
上的属性(property)是报告观察者取出的订阅何时被显式处置,而不是何时发生内部清理 - 但您没有存储此句柄以便能够处置它:
xs.Subscribe(ob); /* return of handle ignored here */
所以你试图断言你处理了你扔掉的订阅,而不是你订阅的可观察对象清理了它可能已经取出的任何订阅和资源。
如果想看4.3/4.4及时资源清理的效果,写个这样的扩展方法:
public static IObservable<T> SpyResourceCleanUp<T>(
this IObservable<T> source, IScheduler scheduler)
{
return Observable.Create<T>(obs =>
{
var subscription = source.Subscribe(obs);
return new CompositeDisposable(
subscription,
Disposable.Create(() => Console.WriteLine(
"Clean up performed at " + scheduler.Now.Ticks)));
});
}
并替换你的行:
xs.Subscribe(ob);
与
xs.SpyResourceCleanUp(ts).Subscribe(ob);
(编辑一些评论)
在您的测试中,我看到了立即的资源清理,正如我所期望的那样。通过此更改,您的测试现在将通过,因为 SpyResourceCleanUp
一旦 OnCompletes() 本身遵守指南的 4.3,就会取消订阅它的父级 (xs)。
这里可能不太明显的是 Observable.Create
处理调用 Dispose()
返回的方法 IDisposable
一旦订阅被处理或 OnComplete()
或 OnError()
已被要求观察员。这是如何Create
帮助您实现第 4.3 节,以及为什么测试通过更改后的代码。
在幕后,订阅 AnonymousObservable<T> : ObservableBase<T>
由 Create
返回被 AutoDetachObserver
as you can see here 包裹着.
即Disposable
你从Observable.Create
回来不是调用者得到的 - 他们得到一个包装版本,它将在流终止或取消时调用你的 Dispose()。
关于c# - TestScheduler 创建的 ColdObserver 在 OnCompleted 时不取消订阅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20351338/
我创建了以下辅助方法来协助测试可观察对象: 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
我是一名优秀的程序员,十分优秀!