我正在使用的应用程序使用Nest框架。我正在为具有两个提供程序的控制器编写一个单元测试:ImdbService
和RabbitMQService
,我都试图在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
。我不知道该如何嘲笑。
感谢您的帮助。
答案 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);
});
});
});
最好的做法是拥有一个可以对您的环境进行最小化复制的存储库(不包含业务逻辑),以便我们可以为您提供更多帮助的基础。
希望它能为您提供更多的见识,即使它不能完全解决您的问题:)