测试一个事件是否在NestJS中被触发



在我们正在构建的项目中,工作流中有一个标准序列。

  1. 控制器收到请求
  2. 然后通过@nestjs/event-emitter触发一个事件
  3. 事件侦听器侦听它并根据事件执行一些代码

我们如何正确地测试一个事件是否被触发,但没有实际执行里面的代码?

我们正在使用Jest进行测试。

Mocking with Jest似乎不起作用,因为我们想要测试实际的触发事件,而不是结果。

有什么建议吗?

"node": "16.14.2"
"@nestjs/event-emitter": "^1.1.0",
"jest": "^27.5.1",

根据@ovidijus-parsiunas的建议,我们成功地窥探了"OnEvent"成功方法。

it.only("start selling", async () => {
const user = await userSeeder.createOne();
const spy = jest
.spyOn(StartSellingListener.prototype, 'startSelling')
.mockImplementation(() => null);
expect(eventEmitter.hasListeners(EventsEnum.USER_START_SELLING)).toBe(true);
const startSelling = userService.startSelling(user);
expect(startSelling).toBeTruthy();
expect(spy).toBeCalledWith(user);
spy.mockRestore();
});

您必须监视侦听事件的处理程序方法,或者监视在该事件中被调用的封装方法。一旦设置了间谍,您就应该能够从测试中触发事件发射器代码,并验证间谍是否已被触发。

最新更新