createAccount에서 사용하는 각 함수들을 테스트하기 위해서 테스트 함수들을 만들어줍니다.
mockResolvedValue()
비동기 테스트를 할 때, 비동기 함수를 mock 하는데 유용합니다.
아래의 코드까지 검사하는 과정입니다.
const exists = await this.users.findOne({ where: { email } });
if (exists) {
return { ok: false, error: 'There is a user with that email already' };
}
createAccount 메서드에서 사용하는 함수들을 한 줄씩 테스트하기 위한 함수들을 describe() 함수를 사용하여 모아줍니다.
MockRepository에서 findOne를 한 뒤 mockResolvedValue를 사용해서 실제 UserService에서 createAccount의 함수가 작동하면 jest에서 코드를 가로채서 test 코드를 실행합니다.
test 코드에서 테스트 createAccount 함수가 실행되면 UserService의 createAccount 메서드에서는 mockResolvedValue의 인자로 넘겨준 값(가짜 값)을 받습니다.
테스트 createAccount 함수로 만들어진 값을 이미 있는 값인지 아닌지 검사합니다.
아래의 코드까지 검사하는 과정입니다.
const user = await this.users.save(
this.users.create({ email, password, role }),
);
위 코드를 검사하기 위해서는 새로운 테스트 함수를 만듭니다.
실제 createAccount 메서드에서 exists 값이 없을 때 다음 줄이 실행되기 때문에 undefined 값을 주어 검사하는 코드가 실행되도록 합니다.
test 코드에서 createAccount() 함수를 실행합니다.
this.users.create
와 this.users.save
가 한 번 불리는지, 어떤 값과 같이 호출되는지 테스트 합니다.
this.users.create({ email, password, role })
코드에서 인자로 보내는 값도 mock 합니다.
아래의 코드까지 검사하는 과정입니다.
const verification = await this.verifications.save(
this.verifications.create({
user,
}),
);
user가 생성된 후 저장될 때 verification도 생성되고 저장되기 때문에 같은 테스트 함수에서 진행합니다.
전역 변수를 사용하여 module에서 verificationsRepository를 저장합니다.
this.verificationsRepository.create
와 this.verificationsRepository.save
가 한 번 불리는지, 어떤 값과 같이 호출되는지 테스트 합니다.
verificationsRepository를 테스트하기 위해 mock 합니다.
아래의 코드까지 검사하는 과정입니다.
this.mailService.sendVerificationEmail(user.email, verification.code);
return { ok: true };
user, verification가 생성된 후 저장될 때 mailService의 sendVerificationEmail 메서드가 실행되기 때문에 같은 테스트 함수에서 진행합니다.
전역 변수를 사용하여 module에서 MailService를 저장합니다.
this.mailService.sendVerificationEmail
이 한 번 불리는지 어떤 argument로 function을 어떻게 호출했는지 확인합니다.
mailService를 테스트하기 위해 user.email과 verification.code이 이미 있기 때문에 mock하지 않아도 됩니다. 없을 때는 mock 해야 합니다.
result가 { ok : true } 와 동일한지 확인합니다.
exception(예외) 됐을 때의 테스트 함수도 만들어줘야 합니다. part1 ~ 4까지 하나라도 예외처리가 되면 fail 되는 것을 test 합니다.
아래의 코드까지 검사하는 과정입니다.
catch (e) {
return { ok: false, error: "Couldn't create account" };
}
fail 됐을 때 테스트하기 위한 함수를 만듭니다.
service.createAccount() 함수를 실행하면 findOne을 reject 상태로 만들어 에러를 발생시킵니다.
result를 확인합니다.