[Jest] Matcher

2023. 3. 1. 21:03공부 중/Node.js

 

1. Matcher?

 

 

Using Matchers · Jest

Jest uses "matchers" to let you test values in different ways. This document will introduce some commonly used matchers. For the full list, see the expect API doc.

jestjs.io

 

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

test('add 1 + 2 to equal 3', () => {
    expect(sum(1,2)).toBe(3);
});

test('add 3 + 3 not to equal 7',() => {
    expect(sum(3,3)).not.toBe(7);
});

matcher란 입력을 해석하고 기댓값과 일치하는지 (혹은 일치하지 않는지) 판별할 때 주로 사용된다.

 

여기서 .toBe가 matcher에 해당한다.

 


2. toBe & toEqual

 

# fn.js

const fn = {
    add : (num1, num2) => num1 + num2,
    makeUser : (name, age) => ({name, age}),
};

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

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

test('이름(Mike)과 나이(30)를 전달받아서 객체를 반환해줘', ()=>{
    expect(fn.makerUser('Mike', 30)).toBe({
        name : 'Mike',
        age : 30
    });
});

지금을 기준으로 알고 있는 matcher는 toBe뿐이다.

 

이름과 나이를 받아서 객체를 반환하는 함수를 테스트하기 위해서 위와 같이 toBe를 matcher로 사용할 것이다.

 

하지만 실제로 테스트를 돌리면 원하는 결과가 나오지 않는다.

 

이는 객체나 배열은 재귀적으로 돌면서 값을 확인해야 하기 때문이다.

 

이때 사용할 수 있는 matcher가 toEqual이다.

 

# fn.test.js

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

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

test('이름(Mike)과 나이(30)를 전달받아서 객체를 반환해줘', ()=>{
    expect(fn.makeUser('Mike', 30)).toEqual({
        name : 'Mike',
        age : 30
    });
});
//테스트 결과
FAIL  ./fn.test.js
  ✕ 이름(Mike)과 나이(30)를 전달받아서 객체를 반환해줘 (2 ms)
  ✓ 이름(Mike)과 나이(30)를 전달받아서 객체를 반환해줘

toBe는 실패 toEqual은 성공했다.

 

toEqual recursively checks every field of an object or array.

 

 

그런데 테스트 결과를 자세히 들여다보면 …

 

expect(received).toBe(expected) //Object.is equality
If it should pass with deep equality, replace "toBe" with "toStrictEqual"

 

 

toEqual이 아닌 toStrictEqual로 바꿀 것을 권한다.

 

toEqualtoStrictEqual의 차이가 무엇일까?

 

toEqual ignores object keys with undefined properties, undefined array items, array sparseness, or object type mismatch.
To take these into account use toStrictEqual instead.

 

 

toEqual의 경우 정의되지 않은 속성과 배열의 요소, 배열의 sparseness, 타입 불일치 등을 무시합니다.

 

즉 비교적 더 널널합니다.

 

 

JavaScript: The Definitive Guide, 6th Edition

Sparse Arrays A sparse array is one in which the elements do not have contiguous indexes starting at 0. Normally, the length property of an array specifies the number of … - Selection from JavaScript: The Definitive Guide, 6th Edition [Book]

www.oreilly.com

 

  • Sparse Arrays : 배열의 length가 실제 가지고 있는 배열의 요소의 수보다 많은 경우. (ex. a[1000] = 0;)

 

출처 : https://youtu.be/_36vt4fBjOQ?list=PLZKTXPmaJk8L1xCg_1cRjL5huINlP2JKt

 


3. toBeNull, toBeUndefined, toBeTrusty, toBeFalsy

 

undefined, null, false를 구분해서 테스트하고 싶을 경우 사용한다.

  • toBeNull matches only null
  • toBeUndefined matches only undefined
  • toBeDefined is the opposite of toBeUndefined
  • toBeTruthy matches anything that an if statement treats as true
  • toBeFalsy matches anything that an if statement treats as false

 

test('null', () => {
  const n = null;
  expect(n).toBeNull();
  expect(n).toBeDefined(); // null은 정의는 되어있다.
  expect(n).not.toBeUndefined();
  expect(n).not.toBeTruthy(); // null은 false네?
  expect(n).toBeFalsy();
});

test('zero', () => {
  const z = 0;
  expect(z).not.toBeNull();
  expect(z).toBeDefined();
  expect(z).not.toBeUndefined();
  expect(z).not.toBeTruthy(); // 0은 false다.
  expect(z).toBeFalsy();
});

// 모두 통과한다.

 


4. toBeGreaterThan, toBeLessThan

 

test('two plus two', () => {
  const value = 2 + 2;
  expect(value).toBeGreaterThan(3);
  expect(value).toBeGreaterThanOrEqual(3.5);
  expect(value).toBeLessThan(5);
  expect(value).toBeLessThanOrEqual(4.5);

  // toBe and toEqual are equivalent for numbers
  expect(value).toBe(4);
  expect(value).toEqual(4);
});

숫자의 크기를 비교하는 matcher다.

 

test('adding floating point numbers', () => {
  const value = 0.1 + 0.2;
  //expect(value).toBe(0.3);           This won't work because of rounding error
  expect(value).toBeCloseTo(0.3); // This works.
});

컴퓨터 특유의 소수점계산 방식 때문에 고통받고 싶지 않다면 소수점계산을 테스트할 때는 toBe 대신에 toBeClose를 사용해라.

 


5. toMatch

 

test('there is no I in team', () => {
  expect('team').not.toMatch(/I/);
});

test('but there is a "stop" in Christoph', () => {
  expect('Christoph').toMatch(/stop/);
});

입력된 문자열에 특정한 패턴이 존재하는지 확인한다.

 

여기서 패턴은 정규 표현식으로 표현한다.

 

 

정규 표현식 - JavaScript | MDN

정규 표현식, 또는 정규식은 문자열에서 특정 문자 조합을 찾기 위한 패턴입니다. JavaScript에서는 정규 표현식도 객체로서, RegExp의 exec()와 test() 메서드를 사용할 수 있습니다. String의 match(), matchA

developer.mozilla.org

 

 

정규 표현식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 노란색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다. 정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp[1] 또는 regex, rational expression)[2][3] 또

ko.wikipedia.org

 


6. toContain

 

const shoppingList = [
  'diapers',
  'kleenex',
  'trash bags',
  'paper towels',
  'milk',
];

test('the shopping list has milk on it', () => {
  expect(shoppingList).toContain('milk');
  expect(new Set(shoppingList)).toContain('milk');
});
# set은 고유한 요소만을 저장하는 컨테이너 입니다.

iteratable 또는 배열이 특정한 아이템을 포함하는지 확인하는 방법이다.

 


7. toThrow

 

function compileAndroidCode() {
  throw new Error('you are using the wrong JDK!');
}

test('compiling android goes as expected', () => {
  expect(() => compileAndroidCode()).toThrow();
  expect(() => compileAndroidCode()).toThrow(Error);

  // You can also use a string that must be contained in the error message or a regexp
  expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
  expect(() => compileAndroidCode()).toThrow(/JDK/);

  // Or you can match an exact error message using a regexp like below
  expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK$/); // Test fails
  expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK!$/); // Test pass
});

 

어떤 함수에 예외가 발생한 경우를 테스트할 때 사용한다.

여기서 주의할 점은 expect의 인수로 전달되는 함수는 () => 함수() 형태를 띤다.

  • toThrow() : 예외가 발생하는지 확인
  • toThrow(Error) : 에러의 타입을 확인. 여기서는 타입이 Error라는 오류 객체인지 확인했다.
  • toThrow(문자열 또는 정규표현식) : 에러메시지가 문자열이나 패턴을 포함하고 있는지 테스트한다.
  • toThrow(/^문자열$/) : 에러메시지와 문자열이 완벽히 일치하는지 테스트한다.

 


8. 그 외

 

 

Expect · Jest

When you're writing tests, you often need to check that values meet certain conditions. expect gives you access to a number of "matchers" that let you validate different things.

jestjs.io

 


 

'공부 중 > Node.js' 카테고리의 다른 글

[Jest] Setup and Teardown  (0) 2023.03.01
[Jest] Testing Asynchronous Code  (0) 2023.03.01
[Jest] node.js 테스트 프레임워크  (0) 2023.03.01
[Javascript] Promise  (0) 2023.03.01
2023-02-19 node.js_17  (0) 2023.02.19