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 的内置方法正确地处理了这种情况,因此除非您在实现中使用计时器,否则这通常没有必要。