Node.js 如何取笑模拟nestjs导入?
我想为我的nestjs“Course”存储库服务(一个依赖于Mongoose模型和Redis的服务)编写一个单元测试 courses.repository.ts:Node.js 如何取笑模拟nestjs导入?,node.js,typescript,unit-testing,jestjs,nestjs,Node.js,Typescript,Unit Testing,Jestjs,Nestjs,我想为我的nestjs“Course”存储库服务(一个依赖于Mongoose模型和Redis的服务)编写一个单元测试 courses.repository.ts: import { Injectable, HttpException, NotFoundException } from "@nestjs/common"; import { InjectModel } from "@nestjs/mongoose" import { Course } from "../../
import { Injectable, HttpException, NotFoundException } from "@nestjs/common";
import { InjectModel } from "@nestjs/mongoose"
import { Course } from "../../../../shared/course";
import { Model } from "mongoose";
import { RedisService } from 'nestjs-redis';
@Injectable({})
export class CoursesRepository {
private redisClient;
constructor(
@InjectModel('Course') private courseModel: Model<Course>,
private readonly redisService: RedisService,
) {
this.redisClient = this.redisService.getClient();
}
async findAll(): Promise<Course[]> {
const courses = await this.redisClient.get('allCourses');
if (!courses) {
console.log('return from DB');
const mongoCourses = await this.courseModel.find();
await this.redisClient.set('allCourses', JSON.stringify(mongoCourses), 'EX', 20);
return mongoCourses;
}
console.log('return from cache');
return JSON.parse(courses);
}
}
我可以创建一个模拟的Redis服务,在测试期间使用它来代替实际的Redis服务吗
怎么做
谢谢,
Yaron你可以模仿你的
再服务
,就像其他依赖一样。因为您真正感兴趣的是Redis客户端而不是服务,所以必须为服务创建一个中间模拟。对于mongoose,您需要getModelToken
方法来获取正确的注入令牌,请参见以下内容:
还请注意,您可能不应该在单元测试中导入模块(除非它是测试模块)。有关单元测试和e2e测试之间的区别,请参见此
如何创建模拟?
看看这个。你能显示你的
课程的代码吗?
beforeEach(async () => {
const moduleRef = await Test.createTestingModule({
imports: [
MongooseModule.forRoot(MONGO_CONNECTION, {
useNewUrlParser: true,
useUnifiedTopology: true
}),
MongooseModule.forFeature([
{ name: "Course", schema: CoursesSchema },
{ name: "Lesson", schema: LessonsSchema }
]),
RedisModule.register({})
],
controllers: [CoursesController, LessonsController],
providers: [
CoursesRepository,
LessonsRepository
],
}).compile();
coursesRepository = moduleRef.get<CoursesRepository>(CoursesRepository);
redisClient = moduleRef.get<RedisModule>(RedisModule);
});
providers: [
{provide: CoursesRepository, useFactory: mockCoursesRepository},
LessonsRepository
],
const redisClientMockFactory = // ...
const redisServiceMock = {getClient: () => redisClientMockFactory()}
providers: [
{ provide: RedisService, useValue: redisServiceMock },
{ provide: getModelToken('Course'), useFactory: courseModelMockFactory },
CoursesRepository
],