NestJS 中的 Mocking Bull 队列

See*_*roy 6 testing mocking nestjs bullmq

我正在尝试测试在向我的一个控制器发送请求后,队列会推送一项作业。实现本身按预期工作。

这是我的app.module.ts

        @Module({
        imports: [
        HttpModule,
        TypeOrmModule.forRoot(typeOrmConfig),
        BullModule.forRoot({
          redis: {
            host: redisConfig.host,
            port: redisConfig.port,
          },
        }),
        // Bunch of unrelated modules
         ],
         providers: [
        {
          provide: APP_FILTER,
          useClass: AllExceptionsFilter,
        },
        ],
         controllers: [SomeControllers],
        })
        export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

这就是我的import.module.ts(使用队列的模块)的样子:

    @Module({
      imports: [
        BullModule.registerQueue({
          name: importQueueName.value,
        }),
       //More unrelated modules,
      ],
      providers: [
        //More services, and bull consumer and producer,
        ImportDataProducer,
        ImportDataConsumer,
        ImportDataService,
      ],
      controllers: [ImportDataController],
    })
    export class ImportDataModule {}
Run Code Online (Sandbox Code Playgroud)

我尝试遵循这种方法

它没有在 beforeAll 钩子中注册队列,我得到了

     Driver not Connected
Run Code Online (Sandbox Code Playgroud)

这种做法

它在测试套件的 beforeAll 钩子中注册了一个队列,我得到:

     TypeError: Cannot read properties of undefined (reading 'call')
    
          at BullExplorer.handleProcessor (node_modules/@nestjs/bull/dist/bull.explorer.js:95:23)
          at MapIterator.iteratee (node_modules/@nestjs/bull/dist/bull.explorer.js:59:26)
          at MapIterator.next (node_modules/iterare/src/map.ts:9:39)
          at FilterIterator.next (node_modules/iterare/src/filter.ts:11:34)
          at IteratorWithOperators.next (node_modules/iterare/src/iterate.ts:19:28)
              at Function.from (<anonymous>)
          at IteratorWithOperators.toArray (node_modules/iterare/src/iterate.ts:227:22)
          at MetadataScanner.scanFromPrototype (node_modules/@nestjs/core/metadata-scanner.js:12:14)
          at node_modules/@nestjs/bull/dist/bull.explorer.js:56:34
              at Array.forEach (<anonymous>)
Run Code Online (Sandbox Code Playgroud)

这是我的“基本测试套件”:

     Driver not Connected
Run Code Online (Sandbox Code Playgroud)

知道这里可能出了什么问题吗?

小智 4

我也遇到了同样的问题,问题出在你的mockQueue。您需要添加一个process模拟函数。

这应该对你有用!

const importQueue: any = { 
  add: jest.fn(),
  process: jest.fn(),
};
Run Code Online (Sandbox Code Playgroud)

这就是我测试的方法。

expect(mockQueue.add).toBeCalledTimes(1);
      expect(mockQueue.add).nthCalledWith(
        1,
        PendoJobNames.SCR,
        {
          ...mockJobDto,
        },
        {
          jobId: mockDto.visitorId,
          removeOnComplete: true,
          removeOnFail: true,
        },
      );
    ```
Run Code Online (Sandbox Code Playgroud)