jest-kefir

用于断言 Kefir Observables 的 Jest 插件。

Build Status


使用方法

使用 npm 安装

npm i --save-dev jest-kefir

在测试文件的顶部,导入 jest-kefirkefir

import Kefir from 'kefir'
import jestKefir from 'jest-kefir'

如果您没有使用 ESModules,请确保获取 default 属性

const Kefir = require('kefir')
const {use} = require('chai')
const jestKefir = require('jest-kefir').default

在您的测试文件顶部,使用导出的工厂函数创建扩展并将其注册到 jest

const {extensions, activate, send, stream, prop, pool} = chaiKefir(Kefir)
expect.extend(extensions)

所有导出的函数都允许您与 Kefir Observables 交互,而无需直接将它们连接到真实或模拟源。


API

Factory: (Kefir) => PluginHelpers

默认导出是一个工厂函数,它接收应用程序的 Kefir 实例并返回一个插件帮助程序对象。这些帮助程序在下面有文档。

PluginHelpers

extensions: {[key: string]: Matcher}

extensions 对象包含用于 Jest 的自定义匹配器。此对象应传递给 Jest 的 expect.extend

activate: (obs: Kefir.Observable) => void

activate 是一个简单的帮助程序函数,用于打开流。

deactivate: (obs: Kefir.Observable) => void

deactivate 是一个简单的帮助程序函数,用于关闭流。它可以关闭使用 activate 激活的流。通过其他方式(直接调用 on{Value|Error|End|Any},使用 observe 等)打开的流需要通过其补充机制来停用。

send: (obs: Kefir.Observable, values: Array<Event<T>>) => obs

send 是一个用于将值发射到给定可观察对象的帮助程序函数。请注意,第二个参数是要从可观察对象发射的值的数组。 Eventvalueerrorend 函数生成。对于这三个函数,可选的 options 对象不需要。

value: (value, options: ?{ current }) => Event<Value>

error: (error, options: ?{ current }) => Event<Error>

end: (options: ?{ current }) => Event<End>

valueerror 接受一个值或错误,以及一个可选的 options 对象,并返回一个 Event 对象,该对象可以传递给 sendemitemitInTimeend 不接受此值,因为 Kefir 中的 end 事件不会随它发送值。

当传递给 send 时,options 对象将被忽略。 options 用于 emitemitInTime(下面都将介绍)来确定事件是否应该被视为 Kefir.Property 的当前事件、错误或结束。

stream: () => Kefir.Stream

prop: () => Kefir.Property

pool: () => Kefir.Pool

streamproppool 是用于创建空流、属性和池的帮助程序函数。这些可以用作模拟源来向其发送值。它们没有其他行为。

断言

toBeObservable

断言预期值是否为 Kefir.Observable

expect(obs).toBeObservable()

toBeProperty

断言预期值是否为 Kefir.Property

expect(obs).toBeProperty()

toBeStream

断言预期值是否为 Kefir.Stream

expect(obs).toBeStream()

toBePool

断言预期值是否为 Kefir.Pool

expect(obs).toBePool()

toBeActiveObservable

断言预期值是否为一个处于活动状态的可观察对象。

expect(obs).toBeActiveObservable()

toEmit

断言提供给定的可观察对象是否同步发射了预期的值。 toEmit 接受一个要匹配的值数组,并期望它们以正确的顺序深度等于这些值。

接受一个可选的回调,在可观察对象被激活后调用。这是因为在可观察对象传递给 Jest 之前发射到可观察对象的值不会发射到断言中,除非它是一个属性。

expect(obs).toEmit([value(1), error(new Error('whoops!')), end()], () => {
  send(obs, [value(1), error(new Error('whoops!')), end()])
})

如果 obs 是一个具有当前值的 Kefir.Property,则预期值应该获得带有 current: true 的选项对象。请注意,鉴于属性的工作方式,只有最后一个值是当前值。

send(obs, [value(1)])
send(obs, [value(2)])
expect(obs).to.emit([value(2, {current: true}), end()], () => {
  send(obs, [end()])
})

这些规则也适用于 toEmitInTime

toEmitInTime

断言提供给定的可观察对象是否及时正确地发射了值。在幕后使用 lolex 接管 JavaScript 的计时器,允许您根据值发射的时间进行断言。预期值应为元组数组,其中第一个值为时间,第二个值为发射的值。

const expected = [[0, value(1)], [10, error(new Error('whoops!'))], [20, end()]]

接受一个回调,它同时传递一个简单的 tick 函数以及完整的 lolex clocktick 将内部计时器提前提供的毫秒数。 clock这里有文档。

expect(obs).toEmitInTime(expected, (tick, clock) => {
  send(obs, [value(1)])
  tick(10)
  send(obs, [error(new Error('whoops!'))])
  tick(10)
  send(obs, [end()])
})

toEmitInTime 还在回调之后接受一个可选的配置对象。该对象接受以下选项

  • reverseSimultaneous: bool: 指示是否应该以相反的顺序调用计划在同一时间的回调。这是一个高级用例,用于检查您的实现是否处理了常见的浏览器错误。有关更多信息,请参阅此 问题。Kefir 的内置方法正确地处理了这种情况,因此除非您在实现中使用计时器,否则这通常没有必要。