ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • expect.extend()
    테스팅/JEST 2019. 10. 18. 15:58

    1. expect.extend()

    extend()는 matcher를 구현할 수 있는 함수다.

    JEST가 제공해주는 matcher 중 내가 원하는 matcher가 없는 경우 직접 구현할 수가 있게 제공한다.

     

    예를 들어서, 숫자 범위를 검증하는 테스트가 필요하다고 해보자.

    이 경우, 기본 제공하는 matcher기능(toBeLessThan(), toBeGreatherThan())으로도 테스트를 해볼 수 있지만 2번의 matcher를 호출해야하므로 불편할 수 있다.

     

    그러니 직접 범위를 검증하는 matcher를 만들어보자.

     

    1. expectExtend.test.js 파일을 하나 만들고 아래의 matcher 생성 코드를 작성하자.

    expect.extend({
        toBeWithinRange(received, floor, ceiling) {
            const pass = received >= floor && received <= ceiling;
            if (pass) {
                return {
                    message: () => `expected ${received} not to be within range ${floor} - ${ceiling}`,
                    pass: true
                };
            } else {
                return {
                    message: () => `expected ${received} to be within range ${floor} - ${ceiling}`,
                    pass: false
                };
            }
        }
    });

     

    toBeWithinRange라는 이름으로 숫자의 범위를 검증하는 코드를 구현했다.

    인자로는 총 3개를 받는다.

    • received : expect()의 인자로 넣은 값
    • floor : 최소 범위
    • ceiling : 최대 범위

     

    검증하고자 하는 값이 최소 범위 보다 크거나 같고, 최대 범위보다 작거나 같으면 true, 아니면 false이다.

    true인 경우 성공 사유와 pass: true를 리턴한다. (테스트 검증 성공 시 메시지가 출력되는 방법은 아직 못찾았다.)

    false인 경우 실패 사유와 pass: false를 리턴한다.

     

     

    2. 테스트 코드를 작성해보자.

    describe('숫자 범위 검증', () => {
        test('in of range', () => {
            expect(100).toBeWithinRange(90, 110);
        });
    
        test('out of range', () => {
            expect(101).toBeWithinRange(0, 100);
        });
    
        test('object verify', () => {
            expect({
                apples: 7,
                bananas: 3
            }).toEqual({
                apples: expect.toBeWithinRange(1, 10),
                bananas: expect.not.toBeWithinRange(11, 20)
            });
        });
    });
    

     

    in of range는 테스트 검증 성공 사례다. 이는 PASS를 리턴받을 수 있을 것이다.

    out of range는 테스트 검증 실패 사례다. 이 때 FAIL을 리턴받을 수 있을 것이다.

    object verify는 객체의 경우 어떻게 검증하는지의 예제다.

     

     

    3. 테스트를 실행해보자.

     

    out of range만 실패하고 나머지는 검증에 성공했다.

     

    실패 한 out of range 케이스는 내가 작성한 message를 콘솔에 출력해준다.

     

     

    비동기 matcher

    extend()를 통해 비동기 matcher도 구현할 수 있다.

     

    1. 비동기 matcher를 작성해보자.

    expect.extend({
        ...
        // 커스텀 비동기 matcher 만들기
        async toBeDivisibleByExternalValue(received) {
            const externalValue = await getExternalValueFromRemoteSource();
            const pass = received % externalValue === 0;
            if (pass) {
                return {
                    message: () => `expected ${received} not to be divisible by ${externalValue}`,
                    pass: true
                }
            } else {
                return {
                    message: () => `expected ${received} to be divisible by ${externalValue}`,
                    pass: false
                }
            }
        }
    });
    
    function getExternalValueFromRemoteSource() {
        return new Promise((resolve, reject) => {
            resolve(5);
        });
    }
    

     

    matcher 안에서 비동기 함수를 호출하여 5라는 값을 얻는다.

    이후 expect()로 전달한 값을 5로 나눈다.

    그에 대한 결과를 리턴한다.

     

     

    2. 테스트 코드를 짜보자.

    describe('(비동기 matcher) 수 나누기 검증', () => {
        test('100 / 5는 0일 것이다.',
            async () => {
                await expect(100).toBeDivisibleByExternalValue();
            });
    
        test('101 / 5는 0이 아닐 것이다.', async () => {
            await expect(101).not.toBeDivisibleByExternalValue();
        });
    
    });
    

     

    100을 5로 나누었을 때 0일 것이라는 테스트 케이스를 작성한다.

    101을 5로 나누었을 때 0이 아닐 것이라는 테스트 케이스를 작성한다.

     

     

    직접 구현한 비동기 matcher도 테스트에 사용할 수가 있다.

     

    이렇게 구현하면 된다.

     

     

     

    참고: https://jestjs.io/docs/en/expect#expectextendmatchers

     

    Jest · 🃏 Delightful JavaScript Testing

    🃏 Delightful JavaScript Testing

    jestjs.io

     

    '테스팅 > JEST' 카테고리의 다른 글

    Mock Return Value  (0) 2019.10.29
    Mock Property  (0) 2019.10.29
    Mock Function  (0) 2019.10.29
    expect.anything()  (1) 2019.10.21
    기초  (0) 2019.10.18
Designed by Tistory.