[英]Mocking dependency in controller unit test
我正在開發的應用程序使用 Nest 框架。 我正在為具有兩個提供程序的控制器編寫單元測試: ImdbService
和RabbitMQService
,我都試圖在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.