npm i jest
Jest 테스트 라이브러리 설치 (npx i jest --g
)
npm install @types/jest
Jest 타입 소스 코드 탐색 기능
npx jest --init
테스트 초기 설정
테스트파일(js) 만들기
function add(a, b) {
return a + b;
}
module.exports = add;
파일명.test.js
형태로 테스트 실행할 파일 만들기const add = require('../add.js');
test('add', ()=> {
// 테스트 코드 작성
expect(add(1,2)).toBe(3);
})
npm run test
테스트 실행 (npx jest
)
jest watchAll
수정 파일 발생 시 테스트 실행
jest --coverage
코드 내 실행되는 테스트 비율
caculator.test.js
const Caculator = require('../calculator.js');
describe('Caculator', () => {
let cal;
// 각각의 테스트는 독립적으로 서로의 테스트 환경에 영향을 끼치지 않아야 함
// describe 내 모든 테스트가 실행되기 전에 새로운 오브젝트 생성
beforeEach(() => {
cal = new Caculator();
})
it('init with 0', () => {
expect(cal.value).toBe(0);
});
it('sets', () => {
cal.set(9);
expect(cal.value).toBe(9);
});
it('clear', () => {
cal.set(9);
cal.clear();
expect(cal.value).toBe(0)
});
it ('adds', () => {
cal.set(1);
cal.add(2);
expect(cal.value).toBe(3);
})
// 에러가 발생할 코드 테스트
// expect내부 콜백함수로 실행시키고
// 에러 발생 여부를 예측하거나 예상되는 에러 메세지를 toThrow 내에 적어서 테스트
it ('add should throw an error if value if value is greater than 100', () => {
expect(()=> {
cal.add(101);
}).toThrow('Value can not be greater than 100');
// }).toThrow(Error);
})
it('subtracts', () => {
cal.subtract(1);
expect(cal.value).toBe(-1);
});
it('multiplies', () => {
cal.set(5);
cal.multiply(4);
expect(cal.value).toBe(20);
});
describe('divides', () => {
it('0 / 0 === NaN', () => {
cal.divide(0);
expect(cal.value).toBe(NaN);
});
it('1 / 0 === Infinity', () => {
cal.set(1);
cal.divide(0);
expect(cal.value).toBe(Infinity);
});
it('3 / 3 === 1', () => {
cal.set(3);
cal.divide(3);
expect(cal.value).toBe(1);
});
})
})
caculator.js
class Calculator {
constructor() {
this.value = 0;
}
set(num) {
this.value = num;
}
clear() {
this.value = 0;
}
add(num) {
const sum = this.value + num;
if (sum > 100) {
throw new Error('Value can not be greater than 100');
}
this.value = sum;
}
subtract(num) {
this.value = this.value - num;
}
multiply(num) {
this.value = this.value * num;
}
divide(num) {
this.value = this.value / num;
}
}
module.exports = Calculator;
async / await
return
을 활용하는 코드 작성 지향
done()
함수 호출의 경우 테스트 시간이 길어지기 때문에 지양됨
async.test.js
// 비동기 테스트
const fetchProduct = require('../async.js');
describe('Async', () => {
it('async - done', (done) => {
fetchProduct().then(item => {
expect(item).toEqual({
item: 'Milk', price: 200
});
done();
});
});
it('async - return', () => {
return fetchProduct().then(item => {
expect(item).toEqual({
item: 'Milk', price: 200
});
});
});
it('async - await', async () => {
const product = await fetchProduct();
expect(product).toEqual({
item: 'Milk', price: 200
})
});
it('async - resolves', () => {
return expect(fetchProduct()).resolves.toEqual({
item: 'Milk', price: 200
})
})
it('async - reject', () => {
return expect(fetchProduct('error')).rejects.toBe('network error')
})
})
async.js
function fetchProduct(error) {
if (error === 'error') {
return Promise.reject('network error');
}
return Promise.resolve({ item: 'Milk', price: 200 });
};
module.exports = fetchProduct;