mig*_*fsf 6 events node.js eventemitter typescript jestjs
我想断言使用 Jest 使用特定参数调用了 EventEmitter 类的发射。我有一个单独的文件,在其中创建要使用的 eventEmitter 实例,并在另一个类上导入它,并在某个时刻发出事件。
// commonEmitter.ts
const events = require('events');
export const commonEmitter = new events.EventEmitter();
// class.ts
import { commonEmitter } from (..)
export class MyClass {
(...)
method(){
commonEmitter.emit('eventName', { data: true});
}
}
// class.spec.ts
let commonEmitterMock: any
beforeEach(() => {
commonEmitterMock = createMock('emit');
});
it('testMyClass', async () => {
const method = new MyClass().method();
expect(commonEmitterMock).toHaveBeenCalledWith('eventName', { data: true})
}
Run Code Online (Sandbox Code Playgroud)
通过这个实现,emit 事件永远不会被调用。不知道为什么,有什么想法吗?
Ash*_*odi -1
最好注入依赖项以使您的类更具可测试性,而不是导入它。所以你的课程看起来像
export class MyClass {
constructor(commonEmitter) {
this.commonEmitter_ = commonEmitter;
}
method(){
this.commonEmitter_.emit('eventName', { data: true});
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的测试文件可能是
let commonEmitterMock: any
beforeEach(() => {
commonEmitterMock = createMock('emit');
});
it('testMyClass', async () => {
const method = new MyClass(commonEmitterMock).method();
expect(commonEmitterMock).toHaveBeenCalledWith('eventName', { data: true})
}
Run Code Online (Sandbox Code Playgroud)