프로젝트 준비 10일차

윤건호·2022년 9월 11일
0

TDD / Jest

목록 보기
2/4

오늘은 유닛테스트에 대한 강의를 보며 공부를 했다.

function Check(predicate, onSuccess, onFail) {
if (predicate()) {
onSuccess("yes");
} else {
onFail("no");
}
}
module.exports = Check;

총 3개의 함수를 받고

predicate 함수가 true 일 경우 onSuccess('yes')

predicate 함수가 false 일 경우 onSuccess('no')

위 코드를 테스트할때 Jest가 제공하는 Api로 좀 더 효율적으로 작성 할 수 있었다.

it("should call onSuccess when predicate is true", () =>
{

check(() => true, onSuccess, onFail);

expect(onSuccess.mock.calls.length).toBe(1);
// true 이기때문에 onSuccess 함수가 1번 호출 돼야한다.
});

위 코드에서 onSuccess 함수가 1번 실행된다는 로직이
expect(onSuccess.mock.calls.length).toBe(1);
이 정도로 나열해야한다.

여기서 jest에서 제공해주는 Api를 사용 할 경우

expect(onSuccess).toHaveBeenCalledTimes(1);

이렇게 줄일 수 있다. (글자 수로 비교하지말자....)

하나 더 예를 들어보면

calls의 첫번째 호출된 함수의 첫번째 인자는 yes가 되어야한다 라는 로직을
expect(onSuccess.mock.calls[0][0]).toBe("yes");

Api를 사용해 줄여보면

expect(onSuccess).toHaveBeenCalledWith("yes");

익숙하지 않다고 멀리 돌아가지말자 라는게 내 앞으로의 좌우명이다.

Mock 처리

테스트하고 싶은 로직 안에 또 다른 로직을 실행하는 함수가 들어있다면,

그 코드는 내가 원하는 최소한의 테스트코드가 아니다.

하물며, 코드 내부에 들어있는 코드가 외부 데이터를 의존하는 코드라면?

여기서 우린 그 부분을 mock 처리할 수 있다.

한번 정리한 적이 있고, 영어 그대로의 뜻도 모조품이라는 뜻을 가지고 있다.

사실 여기까지 완벽히 정리된게 아니긴한데

오늘 여기서 시간을 가장 많이 썼기 때문에 삽질한 내용을 벨로그에 적어보려 한다.

강의 자체는 js로 했지만 나는 ts로 항상 바꿔 실행한다.

그것 때문인가 하는건지는 정확히 파악이 안됐지만 ,

cannot redeclare block-scoped variable 'productclient'.

이 예쁘장한 에러때문에 오늘 머리털 다 빠질뻔 했다.

1 .변수의 이름을 바꾸거나
2. TypeScript 모듈을 사용하고 빈 내보내기를 추가합니다.{}:
3. DOM 유형을 추가하지 않고 컴파일러 옵션을 구성합니다.

총 3가지의 해결법을 찾았다.

내 역량 부족인게,

에러 해결 시도 1.

1번을 시도하다 이름 자체가 헷갈려서 전부 꼬여서 다른 에러를 만들어냈다.

Your test suite must contain at least one test.

하나 이상의 테스트가 포함되어야 한다 에러인데

진짜 억울한게 그 파일엔 테스트가 포함 안됐다.

적어도 강의에선 그랬고,

내가 이해하기로도 그 파일 자체를 mock처리 해서 가짜로 만들건데,

사실 내 머릿속에 정리가 안됐다.

에러 해결 시도 2.

2번은 뭔 소리냐면 그냥 에러난 부분위에 export {}; 하라는 뜻이다.

실제로 해보니 당장의 에러는 해결이 된다.

신나서 내 원래 목적인 test를 해보니 Jest가 export {}; 가 뭐냐고 물어본다.

에러 해결 시도 3.

3번은 tsconfig.json을 편집하라는건데 함부로 건들기 무섭다.

오늘 한 마디 : 강의를 해치우듯이 쫙쫙 듣고 진도도 나가고 싶었는데,
역시 내 마음대로 되는게 없다.

profile
더 배우고 싶은 프론트엔드 개발자 윤건호입니다.

0개의 댓글