javascript - 测试 rxjs : How to fake-click an element and check the resulting stream with marble diagrams?

标签 javascript unit-testing rxjs reactive-programming

我的意图:我有一个 View 组件,它在点击时发出一系列指令 给其成员。我想测试单击按钮是否会发出 按所有交互元素的预期顺序进行说明。

我已经编译了一个带有按钮 ab 的小示例,它应该发出 将字符串 'a''b' 放入同一个 observable 中。

为了方便起见,我将添加导入语句:

import $ from 'jquery';
import { TestScheduler } from 'rxjs/testing/TestScheduler';
import 'rxjs/add/observable/fromEvent';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do;
import 'rxjs/add/observable/merge';

创建一个容器,并附加 ab 按钮。

const container = document.createElement('div');
const a = document.createElement('button');
const b = document.createElement('button');
container.append(a);
container.append(b);

从两个按钮的点击事件创建点击流并将它们合并。

const stream = Observable.merge(
  Observable.fromEvent(a, 'click').map(() => 'a'),
  Observable.fromEvent(b, 'click').map(() => 'b')
);

为弹珠测试创建一个测试调度程序。

const marbles = new TestScheduler((x, y) => expect(x).to.deep.equal(y));

这个冷可观察应该,作为副作用,点击按钮。我不是 当然可以,事实上,我很确定不是。 为什么?

marbles.createColdObservable('-a-b', { a, b }).do(element => $(element).click());

我希望按照上面的 const stream 的定义看到两个按钮的发射。

marbles.expectObservable(stream).toBe('-a-b');
marbles.flush();

结果是:

AssertionError: expected [] to deeply equal [ Array(2) ]

因为不会生成任何点击事件。为什么?我假设我的假设 错误的是上面的代码实际上生成了点击事件。如果是的话,(不然怎么办) 我可以使用弹珠图测试实际的 DOM 点击事件吗?

注意:这是一个最小的示例,我要测试的实际代码更复杂, 并涉及一些按钮由于我操纵的条件而改变状态 通过其他弹珠图。我不想测试 Observable.fromEvent,我会 想要测试我在 const stream 中的流定义是否正确。

最佳答案

解决方案是订阅通过弹珠创建的冷可观察对象。

marbles
  .createColdObservable('-a-b', { a, b })
  .do(element => $(element).click())
  .subscribe();

否则弹珠的副作用不会被执行。事实证明,我犯了一个愚蠢的错误!

关于javascript - 测试 rxjs : How to fake-click an element and check the resulting stream with marble diagrams?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500945/

相关文章:

javascript - Chrome V8 错误

c# - 用于单元测试 .net 标准库的框架/visual studio 项目类型?

angular - 如何使用 RxJs 处理/排队多个相同的 http 请求?

javascript - 通过可观察量将数据从组件传递到服务

javascript - jQuery.ajax() 和发送 bool 请求参数

javascript - 以 Angular 2 相交两个对象

javascript - 提交时的 Angular 验证

java - Mockito - 准确验证所有参数

c# - 单元测试规则

javascript - 从 API Angular 获取图像