코드앙마님의 강의를 보며 작성한 글입니다.
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을 사용하여 확인해주어, 테스트가 성공한다.
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
가 나오는 것을 허용하지 않기 때문에 실패한다.
test('null은 null입니다.', () => {
expect(null).toBeNull();
})
test('0은 false 입니다.', () => {
expect(0).toBeFalsy();
})
toBeGreaterThan
: 크다toBeGreaterThanOrEqual
: 크거나 같다toBeLessThan
: 작다toBeLessThanOrEqual
: 작거나 같다test('아이디는 10자 이상이여야 합니다.', () => {
const id = "id_length_check"
expect(id.length).toBeGreaterThanOrEqual(10);
});
test('0.1 + 0.2', () => {
expect(0.1 + 0.2).toBe(0.3);
});
위의 코드는 당연히 통과해야 할 것 같지만, 우리가 보통 계산할 때 사용하는 10진법
과 달리 컴퓨터는 2진법
으로 동작하게된다.
몇몇 소수는 10진법에서 2진법으로 변환하는 과정에서 무한 소수
가 되어버린다. 저장공간에 한계가 있는 컴퓨터는 무한 소수를 유한 소수로 바꾸게 되는데, 이 과정에서 미세한 오차
가 발생해서 0.1 + 0.2 !== 0.3 이 되어 버린다.
test('0.1 + 0.2 = 0.3', () => {
expect(0.1 + 0.2).toBeCloseTo(0.3);
});
toBeCloseTo의 경우 근사값을 비교
해주기 때문에 이 테스트 케이스는 통과하게 된다.
toMatch의 경우에는 문자열을 다루어서 정규식을 통해서 해당 문자열이 위치하는지 확인하는 함수이다.
test('Hello World에 e 라는 글자가 있나?', () => {
expect('Hello World').toMatch(/e/);
});
test('Hello World에 h 라는 글자가 있나?', () => {
expect('Hello World').toMatch(/h/i);
});
i
: Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.배열요소에서 특정 요소가 위치하는지 확인할 수 있는 함수이다.
test('유저 리스트에 Mike가 있나?', () => {
const user = 'Mike';
const userList = ['Mike', 'Jane', 'Kai'];
expect(userList).toContain(user);
});
// 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가 발생합니다.');
});