🗃️ 내가 다시 볼 것

[Jest] toThrow()로 에러 케이스 검사 할 때 expect() 인자로는 함수를 전달

전호영 2024. 2. 16. 01:40

Test하려는 코드 

    private parseOrderFilter<T extends BaseModel>(key: string, value: any): FindOptionsOrder<T> {
        const order: FindOptionsOrder<T> = {};
        const split = key.split('__');
        if (split.length !== 2) {
            throw new BadRequestException(
                `order 필터는 '__'로 split 했을 때 길이가 2여야 합니다. - 문제되는 키값 : ${key}`,
            );
        }
        const [_, field] = split;

        order[field] = value;
        return order;
    }

 

위 코드에서 split.length !== 2 인 경우를 테스트 할 예정.

 

일반적으론 아래와 같이 작성하면 됨.(expect()의 인자로 함수를 그대로 전달해주면 된다.)

    describe('parseOrderFilter 테스트(public, protected 메서드를 테스트하는 경우)', () => {
        it('실패 케이스 _ split 길이가 2가 아닌 경우', () => {
            const key = 'where__id__less_than';
            const value = 30;
            expect(service['parseOrderFilter'](key, value)).toThrow(
                new BadRequestException(
                    `order 필터는 '__'로 split 했을 때 길이가 2여야 합니다. - 문제되는 키값 : ${key}`,
                ),
            );
        });
    });

 

그러나 우리가 테스트하려는 함수는 private 메서드.

private은 직접 접근할 수 없으므로, private 메서드를 호출하는 함수를 넘겨주면 됨.

 

    describe('parseOrderFilter 테스트(private 메서드를 테스트하는 경우)', () => {
        it('실패 케이스 _ split 길이가 2가 아닌 경우', () => {
            const key = 'where__id__less_than';
            const value = 30;
            expect(() => service['parseOrderFilter'](key, value)).toThrow(
                new BadRequestException(
                    `order 필터는 '__'로 split 했을 때 길이가 2여야 합니다. - 문제되는 키값 : ${key}`,
                ),
            );
        });
    });

 

요약

1. 테스트하려는 메서드가 public, protected 면 expect() 인자로 메서드를 그대로 넘겨주면 됨.

2. 테스트하려는 메서드가 private이면 exptect() 인자로 private 메서드를 호출하는 wrapper 함수를 넘겨주면 됨.