-
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' 카테고리의 다른 글
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