用笑话模拟自定义事件发射器

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)