簡體   English   中英

控制器單元測試中的模擬依賴

[英]Mocking dependency in controller unit test

我正在開發的應用程序使用 Nest 框架。 我正在為具有兩個提供程序的控制器編寫單元測試: ImdbServiceRabbitMQService ,我都試圖在beforeEach()方法中模擬beforeEach() 我的問題在於嘲笑后者,即RabbitMQService提供者。

我為控制器編寫測試的計划是模擬amqplib或通過模擬amqplib測試它,但我不確定哪種方法更好。 總的來說,我對使用 Jest 進行測試也是完全陌生的。

RabbitMQService看起來像這樣

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

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

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

任何形式的幫助表示贊賞。

您的問題可能已在此處(部分)得到解答
您也可以參考這些鏈接:
- NestJS 文檔的自定義提供者
- 和 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);
    });
  });
});

最好是擁有一個對您的環境進行極簡復制的存儲庫(沒有業務邏輯),以便我們可以有一個基礎來幫助您更多。

希望這能給你更多的洞察力,即使它不能完全解決你的問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM