본문 바로가기
Study/node.js

Node.js - TDD 시작하기 (2)

by 김만두_ 2023. 11. 17.

Jest 기초 문법과 비동기 테스트 방법

//테스트 코드 형태는 아래와 같다
const 변수 = require('../테스트할파일.js')

describe('테스트 그룹 이름', () => {
	it('테스트1', () => {
	expect( 테스트할 변수나 값 ).toBe( 결과 값 )
	}
	it('테스트2', () => {
	expect( 테스트할 변수나 값 ).toBe( 결과 값 )
	}
}
  • describe
    • 테스트를 그룹화, 테스트 단위를 묶는 가장 큰 단위
  • test, it
    • 기본 테스트를 진행
    • test()와 it()은 동일한 기능을 수행
  • expect
    • 값을 테스트 할 때마다 사용
    • 혼자 사용하지 않고, 아래의 형태로 사용
    • expect( 테스트할 변수나 값 ).matcher함수( 결과 값 )

콜백 테스트

비동기 메소드는 이벤트 루프로 인해 나중에 처리되기 때문에, 비동기의 결과를 검증 하기위해선 콜백에 **expect()**를 사용해야한다.

여기서 중요한 건 done 이다.

done은 Jest Runner에게 명시적으로 이 테스트 함수는 비동기 코드를 테스트 하니 콜백 함수가 호출되는 지도 좀 봐달라고 알려주는 역할을 한다.

따라서 비동기 함수를 검증하려 할때 결과를 콜백 함수로 받는다면, 콜백 함수 인자에 done을 써주고, done()을 호출해서 끝내야 한다.

test("fetch a user", (done) => { // 콜백 인자에 done을 써서 비동기 함수 테스트임을 반드시 명시 !!
  const cb = (user) => {
    // 인자로 받은 리턴값 user객체가 해당 객체와 Equal일 경우 테스트
    expect(user).toEqual({ 
      id: 1,
      name: "User1",
      email: "1@test.com",
    });
    
    done(); // 비동기 실행 end
  }
  
  fetchUser(1, cb);
});

Promise 테스트

Promise 비동기 함수는 then() 을 통해 직관적으로 비동기 결과 실행을 검증 할 수 있다.

여기서 조심해야 할 점은 비동기 실행은 Jest Runner와 따로 놀기때문에 테스트가 제대로 안될 것이다.

따라서 Jest Runner에게 Promise가 resolve되게 기다리라고 명령을 설정해 줘야 하는 데, 이때 return 을 명시해주면 된다.

test("fetch a user", () => {
  // Promise 객체 함수에 return을 써서, Jest Runner가 Promise가 resolve될때까지 기다려 주게 한다.
  return fetchUser(1) 
  	.then((user) => {
        expect(user).toEqual({
          id: 1,
          name: "User1",
          email: "1@test.com",
    	});
  	});
});

async / await 테스트

위의 생소한 코드들과 달리 async / await 문법은 빛을 발한다.

코드가 매우 깔끔해지며, 직관적으로 사용할 수 있다.

왠만한 비동기 함수를 검증할때는 해당 문법을 사용해서 검증 하기를 추천한다.

test("fetch a user", async () => {
  const user = await fetchUser(1);
  
  expect(user).toEqual({
    id: 1,
    name: "User1",
    email: "1@test.com",
  });
});