nest 单元测试 mongo
时间: 2025-01-02 16:34:39 浏览: 5
### 关于 NestJS 中 MongoDB 的单元测试
在构建基于 NestJS 和 MongoDB 应用程序时,为了提高开发效率并确保代码质量,单元测试扮演着至关重要的角色。当涉及到 `findOne` 或其他与数据库交互的方法时,可以采用模拟(mocking)技术来替代实际的数据库调用。
对于 `findOne` 方法而言,在不需要真正访问数据库的情况下验证其行为成为可能。这通常涉及创建一个服务类及其模块定义,并利用 Jest 测试框架提供的功能来进行依赖注入替换[^4]。
下面是一个简单的例子展示如何为使用 Mongoose ORM 访问 MongoDB 的 User 服务编写单元测试:
#### 定义用户模式和服务逻辑
首先假设有一个基本的服务文件 user.service.ts 如下所示:
```typescript
import { Injectable } from '@nestjs/common';
import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
import { User, UserDocument } from './schemas/user.schema';
@Injectable()
export class UserService {
constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}
async findOne(username: string): Promise<User | null> {
return this.userModel.findOne({ username }).exec();
}
}
```
#### 编写单元测试案例
接下来是在同一目录下的 user.service.spec.ts 文件中编写的相应测试套件:
```typescript
import { Test, TestingModule } from '@nestjs/testing';
import { getModelToken } from '@nestjs/mongoose';
import * as mongoose from 'mongoose';
import { UserService } from './user.service';
import { User, UserDocument } from './schemas/user.schema';
describe('UserService', () => {
let userService: UserService;
let model: jest.Mocked<Model<UserDocument>>;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
UserService,
{
provide: getModelToken(User.name),
useValue: {
new: jest.fn(),
find: jest.fn().mockReturnThis(),
exec: jest.fn(),
lean: jest.fn().mockReturnThis(),
where: jest.fn().mockReturnThis(),
equals: jest.fn().mockReturnValue(true),
findOne: jest.fn().mockResolvedValue(null), // 默认返回null表示未找到记录
},
},
],
}).compile();
userService = module.get<UserService>(UserService);
model = module.get(getModelToken(User.name));
});
it('should be defined', () => {
expect(userService).toBeDefined();
});
describe('#findOne()', () => {
it('returns a single document by username when found', async () => {
const mockUser = { _id: new mongoose.Types.ObjectId(), username: 'test' };
(model.findOne as jest.Mock).mockImplementationOnce(() =>
Promise.resolve(mockUser)
);
const result = await userService.findOne('test');
expect(result).toEqual(mockUser);
});
it('returns null if no documents match the query criteria', async () => {
const result = await userService.findOne('nonexistent');
expect(result).toBeNull();
});
});
});
```
在这个示例里,通过覆盖默认提供者实现了对模型方法的一次性重载,从而允许更灵活地控制每次查询的结果。这种方法不仅简化了设置过程,而且使得测试更加直观易懂。
阅读全文