jest 여러가지 to~~(toBe, toEqual, toStrictEqual...) 사용해보기

2021. 3. 17. 23:24javascript/테스팅

ToBe와 ToEqual 사용해보기 

테스트하려는 코드 

const hi = {
    add : (num1, num2) => num1 * num2,
    makePerson: (name, age) =>({name, age})
}

module.exports = hi;

 

두개의 객체는 서로 일치하니 당연히 true가 되어야 할것 같은데 toBe의 경우에는 테스트를 통과하지 못하고 있다. 

const fn = require("./hi");

test('사람 만들기 ToEqual', () => {
    expect(fn.makePerson("sanghoony", 12)).toEqual({
        name:"sanghoony", 
        age:12});
});

test('사람만들기 ToBe ', () => {
    expect(fn.makePerson("sanghoony", 12)).toBe({
        name:"sanghoony",
        age:12
    });
});

 

toBe와 toEqual 사이에는 몇가지 차이점이 있다. 

 

원시적인 타입(number, boolean, string, null)을 사용한다면 toBe와 toEqual 사이에 큰 차이점이 없다. 하지만 객체의 경우 다르다고 결과가 나온다. 

 

이와 같은 경우에는 ==, ===의 차이를 생각해보면 편하다. 

 

특정 객체가 있는데

var a = { bar: 'baz' },
    b = { foo: a },
    c = { foo: a };
    
    
b.foo.bar === c.foo.bar
true

b.foo.bar === a.bar
true

c.foo === b.foo
true

 

하지만 아래와 같은 경우에는 false가 나온다. 서로 다른 메모리에 위치하기 때문이다. 즉 위의 현상도 비슷할 것이다. 

b === c
false

 

즉 toEqual은 재귀적으로 각 요소들을 확인하기 때문에 true가 나온다. 

 

toStrictEqual

이름 그래도 일반적인 Equal 보다는 훨씬 엄격한 Equal입니다. 기존과는 다르게 특정 요소에 undefined가 나오는 것을 허용하지 않습니다. 

const hi = {
    add : (num1, num2) => num1 * num2,
    makePerson: (name, age) =>({name, age, married:undefined})
}

module.exports = hi;

 

테스트 코드

const fn = require("./hi");

test('사람 만들기 ToEqual', () => {
    expect(fn.makePerson("sanghoony", 12)).toEqual({
        name:"sanghoony", 
        age:12});
});

test('사람만들기 ToStrictEqual ', () => {
    expect(fn.makePerson("sanghoony", 12)).toStrictEqual({
        name:"sanghoony",
        age:12
    });
});

 

결과

 

toBeTruthy, toBeFalsy, toBeNull

test('null Check', () => {
    expect(null).toBeNull();
});

test('toBeFalsy', () => {
    expect(0).toBeFalsy();
});

test('toBeTruthy', () => {
    expect(true).toBeTruthy();
});

결과

 

toBeGreaterThan, toBeGreaterThanOrder, toBeLessThan, toBeLessThanOrder

toBeGreaterThan 크다
toBeGreaterThanOrder 크거나 같다
toBeLessThan 작다 
toBeLessThanOrder 작거나 같다

아래의 경우 10보다 길이가 길면 true이다. 12345678910은 10보다 더 크기때문에 아래는 test가 통과하게 된다. 

test('password 입력 길이 제한', () => {
    const PASSWORD = "12345678910"
    expect(PASSWORD.length).toBeGreaterThan(10);
});

아래의 경우에는 10보다 작은 경우이기 때문에 false로 에러가 발생한다. 

test('password 입력 길이 제한', () => {
    const PASSWORD = "12345678910"
    expect(PASSWORD.length).toBeLessThan(10);
});


ToBeCloseTo

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

이 코드가 당연히 통과해야 할 것 같지만 결과는 아래와 같다. 

 

이상한 값이 나오면 통과하지 못하게 된다. 왜 이렇게 되는 것일까? 

 

0.1과 0.2 각각 2진수로 변경 후 값을 더해주기 때문에 예상치 못한 오류가 발생하게 된다. 

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

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

 

ToMatch

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

 

아래는 f가 있기 때문에 테스트 코드가 통과하게 된다. 

test('해당 문자열에 f가 있나요?', () => {
    expect("finally").toMatch(/f/);
})

 

ToContain

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

test('해당 문자열에 f가 있나요?', () => {
    const member = ["Lee", "Kim", "Choi", "Kang", "Park"];
    expect(member).toContain("Hu");
})

 

ToThrow

js 코드 수정

const hi = {
    add : (num1, num2) => num1 * num2,
    makePerson: (name, age) =>({name, age, married:undefined}),
    throwError:()=> {throw new Error("Error 발생")},
}

module.exports = hi;

아래의 경우에는 위 코드가 변경된 대로 에러가 발생하기 때문에 아래 테스트는 잘 통과한다. 

test('에러 발생 체크', () => {
    expect(()=>fn.throwError()).toThrow();
});

 

에러가 나는 내용까지 비교해서 체크할 수 있다. 예를 들어 필자는 "Error 발생"이라는 메시지와 함께 실행시켰는데 toThrow("메시지")로 지정해주면 메시지 까지 같은지 비교해준다. 

 

const fn = require("./hi");

test('에러 발생 체크', () => {
    expect(()=>fn.throwError()).toThrow("에러가 안나왔어");
});

 

 

 

 

위와 같은 경우에는 new Error("메시지")와 다르기 때문에 테스트를 통과하지 못한다.