2023. 3. 1. 21:03ㆍ공부 중/Node.js
1. Matcher?
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
로 바꿀 것을 권한다.
toEqual
과 toStrictEqual
의 차이가 무엇일까?
toEqual
ignores object keys withundefined
properties,undefined
array items, array sparseness, or object type mismatch.
To take these into account usetoStrictEqual
instead.
toEqual
의 경우 정의되지 않은 속성과 배열의 요소, 배열의 sparseness, 타입 불일치 등을 무시합니다.
즉 비교적 더 널널합니다.
- Sparse Arrays : 배열의 length가 실제 가지고 있는 배열의 요소의 수보다 많은 경우. (ex.
a[1000] = 0;
)
출처 : https://youtu.be/_36vt4fBjOQ?list=PLZKTXPmaJk8L1xCg_1cRjL5huINlP2JKt
3. toBeNull, toBeUndefined, toBeTrusty, toBeFalsy
undefined, null, false를 구분해서 테스트하고 싶을 경우 사용한다.
toBeNull
matches onlynull
toBeUndefined
matches onlyundefined
toBeDefined
is the opposite oftoBeUndefined
toBeTruthy
matches anything that anif
statement treats as truetoBeFalsy
matches anything that anif
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/);
});
입력된 문자열에 특정한 패턴이 존재하는지 확인한다.
여기서 패턴은 정규 표현식으로 표현한다.
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. 그 외
'공부 중 > 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 |