Я пытался покрыть нашу кодовую базу тестами.Я использую jest
с NestJS .Это метод входа в систему.
public async login(
@Body() loginDto: DUserLoginRequest,
): Promise<DResponse<DLoginResponseV2>> {
const user: User = await this.userService.verifyCredentials(
loginDto.login,
loginDto.password,
);
let userTransformed = new DUser(user);
let accessToken: string = await this.authService.generateUserAccessToken(
user,
);
return new DResponse<DLoginResponseV2>(
'Successfully logged in',
new DLoginResponseV2(userTransformed, accessToken),
);
}
UserService.verifyCredentials()
выбрасывает UnauthorizedException
, если указан неправильный адрес электронной почты или пароль.
А вот мои контрольные примеры.
describe('login', () => {
it('should return user details on successfull login', async () => {
let loginPayload: DUserLoginRequest = {
login: 'sayantan.das@codelogicx.com',
password: 'sayantan94'
};
let dUser = new DUser(user);
let response = new DResponse<DLoginResponseV2>(
'Successfully logged in',
new DLoginResponseV2(dUser, 'access_token')
);
expect(await userController.login(loginPayload)).toEqual(response);
expect(userService.verifyCredentials).toBeCalled();
expect(userService.verifyCredentials).toBeCalledWith(loginPayload.login, loginPayload.password);
expect(authService.generateUserAccessToken).toBeCalled();
expect(authService.generateUserAccessToken).toBeCalledWith(user);
expect(authService.generateUserAccessToken).toReturnWith('access_token');
});
it('should throw UnauthorizedException if wrong email or password is provided', async () => {
let loginPayload = {
login: 'wrongemail@gamil.com',
password: 'wrongpassword'
} as DUserLoginRequest;
await expect(userController.login(loginPayload)).rejects.toThrow(UnauthorizedException);
// this assertion fails. but works all right if the successful login test case is removed
await expect(authService.generateUserAccessToken).not.toBeCalled();
});
});
Но этот контрольный пример не проходит
FAIL src/modules/user/user.controller.spec.ts
● User Controller › login › should throw UnauthorizedException if wrong email or password is provided
expect(jest.fn()).not.toBeCalled()
Expected mock function not to be called but it was called with:
[{"country_code": "+91", "email": "sayantan.das@codelogicx.com", "first_name": "Sayantan", "id": 1, "image": "image.url", "last_name": "Das", "password": "$2a$10$.5OelkOKIn9rRuXMsge.yO8tgZdqK8i7PX7knJdjVdqgal7vsky16", "phone_number": "8013220938", "registration_status": "verified"}]
115 |
116 | await expect(userController.login(loginPayload)).rejects.toThrow(UnauthorizedException);
> 117 | await expect(authService.generateUserAccessToken).not.toBeCalled();
| ^
118 | });
119 | });
120 | });
Он не пройден, потому что тестовый сценарий с успешным входом в систему вызывает метод generateAccessToken
,Если я удаляю успешный тестовый случай входа в систему, он работает нормально.Здесь я что-то не так делаю?