Nest.JS使用Jest测试EventEmitter Handler

jgzswidk  于 2023-04-27  发布在  Jest
关注(0)|答案(1)|浏览(172)

我正在用Nest.JS开发一个后端API,到目前为止效果很好。
最近我用Jest添加了测试,效果很好。
但是,我遇到了一个问题,我不知道如何解决这个问题。
我使用EventEmitter2来发出和处理事件。所以基本上是在服务函数上,我在数据库上执行一些操作,然后发出一个自定义事件,这样另一个处理程序就可以做一些事情。
当我调用API时,这就像一种魅力。然而,它在测试环境中不起作用。
我没有得到任何错误,一切似乎都工作,但事件没有被消耗,当在测试中(console.log没有出现,但当从“外部”API调用时,它按预期工作)。

// the same test function calls the function that will emit an event
// i add delay to ensure the event can be consumed in the meantime
jest.setTimeout(30000);
  it('should contain metadata', async () => {
    await new Promise((r) => setTimeout(r, 5000));
    const response = await controller.findAll(testAccount);
    // it should contain metadata, but it is still undefined, so event is not consumed

这是测试设置:

beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [
        EventEmitterModule.forRoot(),
        MyModule,
        //..
      ],
    }).compile();

this.eventEmitter.emit('event', { data });

// the consumer
@OnEvent('event')
  async handleEvent
fnvucqvd

fnvucqvd1#

问题似乎出在OnEvent装饰器上,所以你可以做的是在你的服务的构造器中添加监听器:

// works
@Injectable()
class MyService {

  constructor(
    emitter: EventEmitter2
  ){
    emitter.on('event', this.handler)
  }

  handler(payload: any){ ... }

}
// does not work
@Injectable()
class MyService {

  @OnEvent('event')
  handler(payload: any){ ... }

}

当然不是一个完美的解决方案。认为问题在于TypeScript编译的某个地方。

相关问题