1

我正在通过 Bull 使用 NestJS 队列并在 Jest 中编写单元测试。我想跳过测试期间触发的作业的处理。

Bull 的测试模式存在 GH 问题,但他们不会实施。

最好我会避免广泛的嘲笑,BullModule最好是一个简单的选项。

4

2 回答 2

2

我也遇到了困难,所以我发布了我的解决方案。我只是为此目的简化了我的代码,因此请谨慎使用,可能会有一些拼写错误等。

describe('JobCreatorService', () => {
  let service: JobCreatorService;
  let moduleRef: TestingModule;

  const exampleQueueMock = { add: jest.fn() };

  beforeEach(async () => {
    jest.resetAllMocks();
    moduleRef = await Test.createTestingModule({
      imports: [
        BullModule.registerQueue({
          name: EXAMPLE_QUEUE,
        }),
      ],
    })
      .overrideProvider(getQueueToken(EXAMPLE_QUEUE))
      .useValue(exampleQueueMock)
      .compile();

    service = moduleRef.get<JobCreatorService>(JobCreatorService);
  });

  afterAll(async () => {
    await moduleRef.close();
  });

  it('should dispatch job', async () => {
    await service.methodThatDispatches();
    expect(exampleQueueMock.add).toHaveBeenCalledWith({example: jobData});
  });
});

我不推荐有副作用的单元测试——比如将数据存储在数据库或 redis 中,这就是这种方法的原因。但是,如果您更喜欢将作业实际存储在 redis 中,您可能会在这里找到一些灵感:https ://github.com/nestjs/bull/blob/master/e2e/module.e2e-spec.ts

于 2021-06-30T08:56:29.320 回答
0

目前,我的解决方法是将测试作业延迟任意高的时间范围。BullModule我可以在构建我的测试模块时进行如下初始化:

moduleRef = await Test.createTestingModule({
moduleRef = await Test.createTestingModule({
  imports: [
    BullModule.forRoot({
      redis: process.env.REDIS_URL,
      defaultJobOptions: {
        delay: 99999999999999999,
      },
    }),
    // ...,
  ],
}).compile();

我不喜欢这样,因为工作会在 Redis 中闲置。

于 2021-05-11T15:20:23.367 回答