테스트 커버리지
유닛 테스트를 진행하다 보면 어떤 부분이 테스트되고 어떤 부분이 테스트되지 않는지 궁금할 수 있다.
jest의 기능중에 전체 코드 중에 테스트되고 있는 코드의 비율과 테스트되고 있지 않은 코드의 위치를 알려주는 jest의 기능이 있다. 이를 커버리지(coverage) 라고한다.
"scripts": {
"start": "nodemon app",
"test": "jest",
"coverage": "jest --coverage"
},
스크립트를 작성하자.
그리고 실행해보자.
npm run coverage
File은 파일, 폴더 이름, %Stmts는 구문 비율, %Branch는 if문 등의 분기점 비율, %Funcs는 함수 비율, %Lines는 코드 비율, Uncovered Line #s는 커버되지 않은 줄 위치를 말한다. 현재 user.js의 5~47 줄은 테스트를 작성하지 않아 테스트가 되고 있지 않다. 테스트를 다음과 같이 작성해보자.
const Sequelize = require('sequelize');
const User = require('./user');
const config = require('../config/config')['test'];
const sequelize = new Sequelize(
config.database, config.username, config.password, config,
);
describe('User 모델', () => {
test('static init 메서드 호출', () => {
expect(User.init(sequelize)).toBe(User);
});
test('static associate 메서드 호출', () => {
const db = {
User: {
hasMany: jest.fn(),
belongsToMany: jest.fn(),
},
Post: {},
};
User.associate(db);
expect(db.User.hasMany).toHaveBeenCalledWith(db.Post);
expect(db.User.belongsToMany).toHaveBeenCalledTimes(2);
});
});
models/user.test.js
각각 init, associate 메서드가 제대로 호출되는지 테스트하는 것이다. db객체는 모킹했다.