控制器单元测试中的模拟依赖

时间:2019-09-02 10:31:14

标签: typescript rabbitmq nestjs

我正在使用的应用程序使用Nest框架。我正在为具有两个提供程序的控制器编写一个单元测试:ImdbServiceRabbitMQService,我都试图在beforeEach()方法中进行模拟。我的问题在于嘲笑后者,即RabbitMQService提供程序。

我为控制器编写测试的计划是模拟amqplib或通过模拟消息对其进行测试,但是我不确定哪种方法更好。我对使用Jest进行测试也完全陌生。

RabbitMQService看起来像这样

@Injectable()
export class RabbitMQService {
    @Inject(RABBITMQ_CONNECTION)
    protected readonly connection: RabbitMQConnection;

    get defaultConnection() {
        return this.connection;
    }
}

其中type RabbitMQConnection = amqp.Connection。我不知道该如何嘲笑。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的问题可能已经(部分)得到了回答here
您也可以参考以下链接:
-Custom providers的NestJS文档
-和testing section的NestJS文档

仍然基于以前的链接,您可以尝试使用类似的方法(未经测试的方法)

import { MessagesController } from './messages.controller';
import { RabbitMQService } from './rabbitmq.service';
import { RabbitMQConnection } from './somewhere';

describe('MessagesController', () => {
  let messagesController: MessagesController;
  let rabbitMqService: RabbitMQService;
  let mockRabbitMQConnection = {
      /* mock RabbitMQConnection implementation
      ...
      */
      // e.g. it could be:
      defaultConnection: (): RabbitMQConnection => { 
        //... TODO some attributes / functions mocks respecting RabbitMQConnection interface / type
      }
  };

  beforeEach(() => {
    const module = await Test.createTestingModule({
        controllers: [MessagesController],
        providers: [RabbitMQService],
      })
      .overrideProvider(RABBITMQ_CONNECTION)
      .useValue(mockRabbitMQConnection)
      .compile();

    rabbitMqService = module.get<RabbitMQService>(RabbitMQService);
    messagesController = module.get<MessagesController>(MessagesController);
  });

  describe('findAll', () => {
    it('should return an array of messages', async () => {
      const result = ['test'];
      jest.spyOn(rabbitMqService, 'findAll').mockImplementation(() => result); // assuming you would have some findAll function in your rabbitMqService service

      expect(await messagesController.findAll()).toBe(result);
    });
  });
});

最好的做法是拥有一个可以对您的环境进行最小化复制的存储库(不包含业务逻辑),以便我们可以为您提供更多帮助的基础。

希望它能为您提供更多的见识,即使它不能完全解决您的问题:)