jest-kefir
用于断言 Kefir Observables 的 Jest 插件。
使用方法
使用 npm 安装
npm i --save-dev jest-kefir
在测试文件的顶部,导入 jest-kefir 和 kefir
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 是一个用于将值发射到给定可观察对象的帮助程序函数。请注意,第二个参数是要从可观察对象发射的值的数组。 Event 由 value、error 和 end 函数生成。对于这三个函数,可选的 options 对象不需要。
value: (value, options: ?{ current }) => Event<Value>
error: (error, options: ?{ current }) => Event<Error>
end: (options: ?{ current }) => Event<End>
value 和 error 接受一个值或错误,以及一个可选的 options 对象,并返回一个 Event 对象,该对象可以传递给 send、emit 或 emitInTime。 end 不接受此值,因为 Kefir 中的 end 事件不会随它发送值。
当传递给 send 时,options 对象将被忽略。 options 用于 emit 和 emitInTime(下面都将介绍)来确定事件是否应该被视为 Kefir.Property 的当前事件、错误或结束。
stream: () => Kefir.Stream
prop: () => Kefir.Property
pool: () => Kefir.Pool
stream、prop 和 pool 是用于创建空流、属性和池的帮助程序函数。这些可以用作模拟源来向其发送值。它们没有其他行为。
断言
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 clock。 tick 将内部计时器提前提供的毫秒数。 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 的内置方法正确地处理了这种情况,因此除非您在实现中使用计时器,否则这通常没有必要。