JwtService에 있는 메서드들을 테스트하기 위해 describe()를 사용하여 테스트할 함수들을 묶어줍니다.
beforeEach() 함수를 사용하여 테스트를 실행하기 전에 module를 만들어서 compile합니다.
JwtService module을 가져와서 전역적으로 사용하기 위해 전역 변수에 저장합니다.
JwtService.sign(), JwtService.verify() 메서드를 테스트 할 준비를 합니다.
const TEST_KEY = 'testKey';
describe('JwtService', () => {
let service: JwtService;
beforeEach(async () => {
const module = await Test.createTestingModule({
providers: [
JwtService,
// constructor 안의 값들을 가져오기 위해 JwtService로 내보내기 위해 providers option을 사용합니다.
{
provide: CONFIG_OPTIONS,
useValue: { privateKey: TEST_KEY },
},
],
}).compile();
service = module.get<JwtService>(JwtService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
it.todo('sign');
it.todo('verify');
});
jest.mock(moduleName, factory, options)
필요할 때 auto-mocked 버전으로 모듈을 mock합니다. 두 번째 인수는 factory에는 Jest의 automocking 기능을 사용하는 대신 실행 중인 명시적 모듈 팩토리를 지정하는 데 사용할 수 있습니다.
import moduleName, {foo} from '../moduleName';
jest.mock('../moduleName', () => {
return {
__esModule: true,
default: jest.fn(() => 42),
foo: jest.fn(() => 43),
};
});
moduleName(); // Will return 42
foo(); // Will return 43
jest.mock으로 mock되는 모듈은 jest.mock을 호출하는 파일에 대해서만 mock됩니다. 모듈을 가져오는 다른 파일은 모듈을 mock하는 테스트 파일 이후에 실행되더라도 원래 implementation을 가져옵니다.
위의 방법으로 'jsonwevtoken'을 mock 하기 위해 jest.mock() 함수를 사용합니다.
sign() 메서드를 테스트하기 위한 describe()를 만들고 안에서 함수들을 테스트합니다. (여기서는 테스트할 함수가 1개라서 굳이 describe()가 필요없지만 코드의 통일성을 위해 사용합니다.)
service.sign() 메서드를 사용합니다. userId를 넘겨줍니다. 이 때 token 값은 위에서 설정한 'TOKEN'이 됩니다.
token type이 string 확인하고, 1번 호출됐는지, 설정한 id와 privateKey로 같이 호출이 됐는지 확인합니다.
위의 방법으로 'jsonwevtoken'을 mock 하기 위해 jest.mock() 함수를 사용합니다.
verify() 메서드를 테스트하기 위한 describe()를 만들고 안에서 함수들을 테스트합니다. (여기서는 테스트할 함수가 1개라서 굳이 describe()가 필요없지만 코드의 통일성을 위해 사용합니다.)
service.verify() 메서드를 사용합니다. sign() 메서드에서 반환된 TOKEN 값을 넣어줘야 하기 때문에 같은 값을 넣어줍니다.
decodedToken이 올바른 userId를 반환하는지 확인하고, jwt.verify가 1번 호출되는지, TOKEN과 privateKey로 같이 호출됐는지 확인합니다.