我有一个全局对象,可以为事件分配功能,例如:
obj.on('event', () => {});
在调用了确切的公共API之后,也会触发这些事件。
现在,我需要使用mocha.js / chai.js编写异步测试,然后在node.js环境中运行它。
我陷入了必须同时测试两个事件订阅的情况。
所有代码都是用TypeScript编写的,后来又转换为JavaScript。
全局对象中的代码:
public someEvent(val1: string, val2: Object) {
// some stuff here...
this.emit('event_one', val1);
this.emit('event_two', val1, val2);
}
测试文件中的代码(我的最新实现):
// prerequisites are here...
describe('test some public API', () => {
it('should receive a string and an object', (done) => {
// counting number of succesfull calls
let steps = 0;
// function which will finish the test
const finish = () => {
if ((++steps) === 2) {
done();
}
};
// mock values
const testObj = {
val: 'test value'
};
const testStr = 'test string';
// add test handlers
obj.on('event_one', (key) => {
assert.equal(typeof key, 'string');
finish();
});
obj.on('event_two', (key, event) => {
assert.equal(typeof key, 'string');
expect(event).to.be.an.instanceOf(Object);
finish();
});
// fire the event
obj.someEvent(testStr, testObj);
});
});
所以,我的问题是-是否有任何内置功能可以使此测试看起来更美观?
另一个问题是如何提供一些有意义的错误信息而不是默认错误字符串?
错误:超时超过2000毫秒。对于异步测试和挂钩,请确保调用了“ done()”;如果返回了Promise,请确保它可以解决。
答案 0 :(得分:0)
感谢LostJon的评论!
我的解决方案是将sinon.js
库添加到项目中并使用sinon.spy
。
解决方案如下:
import * as sinon from 'sinon';
...
// prerequisites are here...
describe('test some public API', () => {
it('should receive a string and an object', (done) => {
const spyOne = sinon.spy();
const spyTwo = sinon.spy();
// mock values
const testObj = {
val: 'test value'
};
const testStr = 'test string';
// add test handlers
obj.on('event_one', spyOne);
obj.on('event_two', spyTwo);
// fire the event
obj.someEvent(testStr, testObj);
// assert cases
assert(spyOne.calledOnce, `'event_one' should be called once`);
assert.equal(typeof spyOne.args[0][0], 'string');
assert(spyTwo.calledOnce, `'event_two' should be called once`);
assert.equal(typeof spyTwo.args[0][0], 'string');
assert.equal(typeof spyTwo.args[0][1], 'object');
});
});