Jest Matchers

HYl·2022년 4월 5일
0

Jest

목록 보기
2/2

코드앙마님의 강의를 보며 작성한 글입니다.


toBe & toEqual

출처

test('toBe는 obj가 같은 객체를 가리키고 있는지 확인한다', () => {

    const obj = {};

    expect(obj).toBe(obj); // true

});

test('객체의 내용이 같더라도 서로 다른 메모리에 있는 객체이기 때문에 toBe를 쓰면 false가 나온다.', () => {

    expect({ name: 'John' }).toBe({ name: 'John' }); // false

});

test('대신에 객체의 내용이 같은지를 확인하려면 toEqual을 써야 한다', () => {

    const obj = {};

    expect({ name: 'John' }).toEqual({ name: 'John' }); // true

});

따라서 객체배열을 테스트 할 때는, toEqual을 사용해야 한다.

// fn.js

const fn = {
  makeUser: (name, age) => ({ name, age }),
};

module.exports = fn;
// fn.test.js
const fn = require('./fn');

// 객체와 배열은 재귀적으로 돌면서 확인해야되기 때문에 toEqual을 사용해야 한다.
test('이름과 나이를 받아서 객체를 반환해줘', () => {
  expect(fn.makeUser('mike', 30)).toEqual({
    name: 'mike',
    age: 30
  })
})

객체를 toEqual을 사용하여 확인해주어, 테스트가 성공한다.


toEqual & toStrictEqual

toStrictEqual 은 toEqual 보다 엄격하다.
권고안으로는 toStrictEqual을 사용하는 것이 좋다.

특정 요소에 undefined가 나오는 것을 허용하지 않는다.

const fn = {
  makeUser: (name, age) => ({ name, age, gender: undefined }),
};

module.exports = fn;
const fn = require('./fn');

test('이름과 나이를 받아서 객체를 반환해줘', () => {
  expect(fn.makeUser('mike', 30)).toEqual({
    name: 'mike',
    age: 30
  })
})

test('이름과 나이를 받아서 객체를 반환해줘', () => {
  expect(fn.makeUser('mike', 30)).toStrictEqual({
    name: 'mike',
    age: 30
  })
})

첫 번째 테스트는 성공하고, toStrictEqual을 사용한 두 번째 테스트는 undefined가 나오는 것을 허용하지 않기 때문에 실패한다.


toBeNull, toBeUndefined, toBeDefined

test('null은 null입니다.', () => {
  expect(null).toBeNull();
})

toBeTruthy, toBeFalsy

test('0은 false 입니다.', () => {
  expect(0).toBeFalsy();
})

숫자 관련

  • toBeGreaterThan : 크다
  • toBeGreaterThanOrEqual : 크거나 같다
  • toBeLessThan : 작다
  • toBeLessThanOrEqual : 작거나 같다
test('아이디는 10자 이상이여야 합니다.', () => {
  const id = "id_length_check"
  expect(id.length).toBeGreaterThanOrEqual(10);
});

toBeCloseTo

test('0.1 + 0.2', () => { 
  expect(0.1 + 0.2).toBe(0.3); 
});

위의 코드는 당연히 통과해야 할 것 같지만, 우리가 보통 계산할 때 사용하는 10진법 과 달리 컴퓨터는 2진법 으로 동작하게된다.
몇몇 소수는 10진법에서 2진법으로 변환하는 과정에서 무한 소수가 되어버린다. 저장공간에 한계가 있는 컴퓨터는 무한 소수를 유한 소수로 바꾸게 되는데, 이 과정에서 미세한 오차가 발생해서 0.1 + 0.2 !== 0.3 이 되어 버린다.

  • 자바 스크립트 숫자는 항상 64 비트 부동 소수점이다.

test('0.1 + 0.2 = 0.3', () => { 
  expect(0.1 + 0.2).toBeCloseTo(0.3); 
});

toBeCloseTo의 경우 근사값을 비교해주기 때문에 이 테스트 케이스는 통과하게 된다.


toMatch

toMatch의 경우에는 문자열을 다루어서 정규식을 통해서 해당 문자열이 위치하는지 확인하는 함수이다.

test('Hello World에 e 라는 글자가 있나?', () => {
  expect('Hello World').toMatch(/e/);
});

test('Hello World에 h 라는 글자가 있나?', () => {
  expect('Hello World').toMatch(/h/i);
});
  • i : Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.

toContain

배열요소에서 특정 요소가 위치하는지 확인할 수 있는 함수이다.

test('유저 리스트에 Mike가 있나?', () => {
  const user = 'Mike';
  const userList = ['Mike', 'Jane', 'Kai'];
  expect(userList).toContain(user);
});

toThrow

// fn.js

const fn = {
  throwErr: () => {
    throw new Error('error가 발생합니다.');
  }
};

module.exports = fn;
// fn.test.js

const fn = require('./fn');

// 에러가 발생하기 때문에, 성공 테스트
test('이거 에러 나나요?', () => {
  expect(() => fn.throwErr()).toThrow();
});

// 에러가 발생하는 내용까지 비교해서 체크할 수 있다.
test('이거 에러 나나요?', () => {
  expect(() => fn.throwErr()).toThrow('error가 발생합니다.');
});
profile
꾸준히 새로운 것을 알아가는 것을 좋아합니다.

0개의 댓글