[Jest] 테스트코드 작성하기

박재현·2022년 3월 28일
0
post-custom-banner

📣 공식 문서


🔎 설치 및 실행

  1. npm i jest Jest 테스트 라이브러리 설치 (npx i jest --g)

  2. npm install @types/jest Jest 타입 소스 코드 탐색 기능

  3. npx jest --init 테스트 초기 설정

  4. 테스트파일(js) 만들기

function add(a, b) {
    return a + b;
}

module.exports = add;
  1. 파일명.test.js 형태로 테스트 실행할 파일 만들기
const add = require('../add.js');

test('add', ()=> {
    // 테스트 코드 작성
    expect(add(1,2)).toBe(3);
})
  1. 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;
post-custom-banner

0개의 댓글