前言
chai-kefir 是一个适用于JavaScript的断言库,允许使用chai的assert,expect,should API结合kefir来测试流数据。本文详细介绍如何使用chai-kefir以及其中的一些技巧和注意点。
安装
使用npm安装chai-kefir:
npm install chai-kefir --save-dev
基础使用
chai-kefir 的使用方式类似chai,使用require加载后直接使用。这里我们对比一下chai和chai-kefir的assert API如何断言一个流数据输出了一个特定的字符串。
chai
-- -------------------- ---- ------- --------- ------ ---- ------ ------ ------ ---- --- ------ -------- -------- ------ - ----- ---------- - --------------------- -------- ----- ------- - ----------------------- -------------------- -- - -------------------------------- ----------------------------- -------- ------- --- ---
chai-kefir
it('chai-kefir: should emit string "hello world" when got "hello world"', function () { const observable = Kefir.constant('hello world'); expect(observable).to.emit('value', (value) => { expect(value).to.be.a('string'); expect(value).to.equal('hello world'); }); });
在使用chai-kefir时,我们可以直接将observable对象传入到expect中进行断言,同时使用emit API指定期望的事件类型和每个事件的判断函数。
API
.emit(eventName[, check])
.emit
API接收两个参数。
eventName
指定期望的事件类型,与kefir中的事件类型一致。check
事件数据的判断函数,用于对每个事件数据进行一系列的断言操作。
observable.should.emit('value', function(value) { expect(value).to.be.a('string'); expect(value).to.equal('hello world'); });
在chai-kefir中, .should
相当于 .to
,expect()
后也可以直接跟.emit
。
.not.emit(eventName[, check])
.not.emit
用于断言当前的observable在指定的事件类型下不会发出事件。
observable.should.not.emit('value');
.to.emitInTime(time, eventName[, check])
.to.emitInTime
用于断言当前的observable在指定的时间内会发出指定的事件。
const observable = Kefir.later(1000, 'hello world'); observable.should.emitInTime(1000, 'value');
.to.emitNext(eventName[, check])
.to.emitNext
用于断言当前的observable只发出一个指定事件,并且该事件是最后一个事件。
observable.should.emitNext('end');
.to.emitSequence(eventsArray)
.to.emitSequence
用于断言当前的observable发出一系列的事件,和数组里的事件一一对应,如果不匹配则断言失败。
observable.should.emitSequence([ ['value', 'hello'], ['value', 'world'], ['value', '!'] ]);
注:前面四个API的check参数传入的是一个check数组,check数组中的每个元素都是一个事件的判断回调, 也可以传不定参数的函数来判断check.
.to.emitNone()
.to.emitNone
用于断言当前的observable不会发出任何事件。
observable.should.emitNone();
错误示例
it('chai-kefir: error demo', function () { const obs = Kefir.sequentially(100, [0, 1, 2]); expect(obs).to.emit('end'); });
上面的代码从返回结果看是通过的,但实际上这里有一个错误,如果触发了其他的事件,比如value,那么就会导致断言失败,正确的写法应该是:
-- -------------------- ---- ------- --------------- ----- ------ -------- -- - ----- --- - ----------------------- --- -- ---- ----------------------------- ---------- --- ---------- --- ---------- --- -------- --- ---
总结
chai-kefir在流数据测试方面提供了一些很方便的API,更直观的语法和在一些特定场景下更优雅的使用方式,能够帮助我们更好地进行流数据的测试,让我们更加自信的面对大规模复杂的JavaScript工程。
除了chai-kefir外,还有很多其他测试工具可以用于流数据的测试,如RxJS marbles, Sinon and Samsa,可以根据业务场景选择适合的测试工具,以提高测试效率和质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedca4fb5cbfe1ea06123d2