NestJs:单元测试mock函数如何有条件或有许多返回用例



如果我使用这种方法,以防我想要找不到用户的signIn throw exeption,我不能,因为findOne已经用值{_id:'5e81f97e6708f22e5c4697d2'模拟了,fullName:'user'},但在这种情况下,我希望findOne返回未定义的值。谢谢

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: jwtConfig.secret,
signOptions: {
expiresIn: jwtConfig.expiresIn
}
})
],
controllers: [AuthController],
providers: [
AuthService,
JwtStrategy,
{
provide: JwtStrategy,
useValue: {
validate: jest.fn().mockResolvedValue(mockUser())
}
},
{
provide: getModelToken('Users'),
useValue: {
new: jest.fn().mockResolvedValue(mockUser()),
findOne: jest.fn().mockResolvedValue({_id:'5e81f97e6708f22e5c4697d2', fullName: 'User'})
}
}
],
exports: []
}).compile();
authController = module.get<AuthController>(AuthController);
authService = module.get<AuthService>(AuthService);
});
it('Should throw exception user not found', async () => {
const request = {
email: 'user@gmail.com',
password: '1234abcd'
};
await expect(authController.signIn(request)).rejects.toThrow();
});
it('Should signIn', async () => {
await expect(authController.signIn(request)).resolves.toEqual(response);
});

假设我可以在其中阻止类似的模拟JwtService标志

it('Should signIn', async () => {
JwtService.prototype.sign = jest.fn().mockResolvedValue(accessToken);
await expect(authController.signIn(request)).resolves.toEqual(response);
});

但是如何使用注入的模块getModelToken("用户"(

为什么不像您已经完成的控制器和authService那样从模块中获取用户模型,并提供一个带有spyOn或为其分配新值的新jest mock?

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: jwtConfig.secret,
signOptions: {
expiresIn: jwtConfig.expiresIn
}
})
],
controllers: [AuthController],
providers: [
AuthService,
JwtStrategy,
{
provide: JwtStrategy,
useValue: {
validate: jest.fn().mockResolvedValue(mockUser())
}
},
{
provide: getModelToken('Users'),
useValue: {
new: jest.fn().mockResolvedValue(mockUser()),
findOne: jest.fn().mockResolvedValue({_id:'5e81f97e6708f22e5c4697d2', fullName: 'User'})
}
}
],
exports: []
}).compile();
authController = module.get<AuthController>(AuthController);
authService = module.get<AuthService>(AuthService);
usersModel = module.get<Model<User>>(getModelToken('Users')
});
it('Should throw exception user not found', async () => {
const request = {
email: 'user@gmail.com',
password: '1234abcd'
};
jest.spyOn(usersModel, 'findOne').mockRejectedValueOnce(new Error('User not found'));
await expect(authController.signIn(request)).rejects.toThrow();
});

最新更新