我尝试编写一个 Nestjs 项目,只在 mongodb 中保存一些对象,但是运行测试规范(users.service 和 users.controller),我得到这个神秘的错误:
Nest 无法解析 UsersService 的依赖关系(?)。请确保索引 [0] 处的参数“UserModel”在 RootTestModule 上下文中可用。
Potential solutions:
- Is RootTestModule a valid NestJS module?
- If "UserModel" is a provider, is it part of the current RootTestModule?
- If "UserModel" is exported from a separate @Module, is that module imported within RootTestModule?
@Module({
imports: [ /* the Module containing "UserModel" */ ]
})
6 |
7 | beforeEach(async () => {
> 8 | const module: TestingModule = await Test.createTestingModule({
| ^
9 | providers: [UsersService],
10 | }).compile();
11 |
我有一个根应用程序模块,用于导入和设置猫鼬和用户模块。应用程序控制器有
/
端点,它只返回状态消息。应用程序控制器的测试有效。我收到用户服务和用户控制器规格的上述错误。 这是用户服务规范的示例
import { Test, TestingModule } from '@nestjs/testing';
import { UsersService } from './users.service';
describe('UsersService', () => {
let service: UsersService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [UsersService],
}).compile();
service = module.get<UsersService>(UsersService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});
用户控制器有 2 个端点来创建和获取新用户。 这是用户模块:
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
import { MongooseModule } from '@nestjs/mongoose';
import { User, UserSchema } from './schemas/user.schema';
@Module({
imports: [
MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
其次是用户服务:
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './schemas/user.schema';
import { Model } from 'mongoose';
import { CreateUserDto } from './dto/create-user.dto';
@Injectable()
export class UsersService {
constructor(@InjectModel(User.name) private userModel: Model<User>) {}
async create(createUserDto: CreateUserDto): Promise<User> {
const user = new this.userModel(createUserDto);
return user.save();
}
async findById(id: string): Promise<User> {
return this.userModel.findById(id).exec();
}
}
这是用户控制器:
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { UsersService } from './users.service';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from './schemas/user.schema';
@Controller('users')
export class UsersController {
constructor(private usersService: UsersService) {}
@Post()
async create(@Body() createUserDto: CreateUserDto) {
await this.usersService.create(createUserDto);
}
@Get(':id')
async findById(@Param('id') id: string): Promise<User> {
return this.usersService.findById(id);
}
}
问题在于规范是如何编写的。我对依赖注入框架很陌生,因此非常感谢您在理解和解决这个问题方面的帮助。
您需要添加
UsersService
的依赖项的模拟,在本例中,是一个与 @InjectModel(User.name)
的注入令牌匹配的自定义提供程序。幸运的是, @nestjs/mongoose
有一个辅助方法来创建此令牌,因此您只需将模拟实例添加到测试模块的 providers
数组中,就可以开始了。
import { getModelToken } from '@nestjs/mongoose';
import { Test, TestingModule } from '@nestjs/testing';
import { User } from './schemas/user.schema';
import { UsersService } from './users.service';
describe('UsersService', () => {
let service: UsersService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UsersService,
{
provide: getModelToken(User.name),
useValue: {
findById: () => ({
exec: jest.fn().mockResolvedValue(someMockUserObject)
})
}
}
],
}).compile();
service = module.get<UsersService>(UsersService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
});