본문으로 바로가기

using matchers : https://jestjs.io/docs/using-matchers

 

matcher란 이거 맞아? 라고 물어보는 메서드입니다. 기대한 값이 실제 반환된 값과 일치하는 지를 확인하는 작업인 것이죠.

모든 matcher를 확인해보고 싶다면 expect에 대한 api 상세서 https://jestjs.io/docs/expect 를 참고합시다.

 

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

 

* it은 test의 별칭임. 따라서 같음

it('should 3', () => expect(3).toBe(3));
test('should 3', () => expect(3).toBe(3));
// 위 두 코드는 같은 코드임

 

일치 판단

 

일반적인 원시값 체크에는 toBe가 사용됩니다.

test('1+2=3. quick math!', () => {
  expect(1 + 2).toBe(3);
});

test('object test', () => {
  const me = { name: 'darren', age: 100 };
  expect(me.name).toBe('darren');
});

// not을 통해 무엇이 아님을 테스트할 수 있음.
test('not 4', () => {
  expect(1 + 2).not.toBe(4);
});

 

레퍼런스 타입의 값에 대한 일치를 체킹하려면 toEqual을 사용합니다. object 형 값들은 애초에 할당되는 메모리 주소가 다르자나여~ 

new Object() === new Object() // false. 할당되는 메모리 주소가 다름.
const makingGame = money => {
  if (money > 1000) return { name: 'goodGame', money };
  else return { name: 'xhitGame', money };
};

test('should return goodGame', () => {
  expect(makingGame(1200)).toEqual({ name: 'goodGame', money: 1200 });
});

 

toEqual대신에 toStrictEqual을 사용하여 좀 더 엄격하게 검수하는 방법도 있습니다.

https://jestjs.io/docs/expect#tostrictequalvalue

class Factory {
  constructor(name) {
    this.name = name;
  }
}

test('instance', () => {
  const fanOne = new Factory('fan');

  expect(fanOne).toEqual({ name: 'fan' }); // pass
  expect(fanOne).toStrictEqual({ name: 'fan' }); // fail
});

 

 

class

특정 클래스의 인스턴스인지 체크합니다. toBeInstanceOf

class Factory {
  constructor(name) {
    this.name = name;
  }
}

test('instance', () => {
  const fanOne = new Factory('fan');

  expect(fanOne).toBeInstanceOf(Factory);
});

 

 

 

참/거짓

 

참거짓 판단에서 falsy, truthy한 값들을 처리하기 위해 아래와 같은 Matcher들을 사용합니다.

undefined, null, and false을 다르게 처리하고 싶다면 toBeNull, toBeUndefined, toBeDefined를 사용하시고

단순히 falsy, truthy를 체킹하고 싶다면 toBeTruthy, toBeFalsy를 사용합니다.

  • 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('my gf is null', () => {
  const myGirlfriend = null;
  expect(myGirlfriend).toBeNull(); // pass
  expect(myGirlfriend).toBeUndefined(); // fail
  expect(myGirlfriend).toBeDefined(); // fail
  expect(myGirlfriend).toBeTruthy(); // fail
  expect(myGirlfriend).toBeFalsy(); // pass
});

 

 

숫자형 값 비교 판단

 

>, >=, <, <= 를 확인합니다. 너무 직관적이라 설명은 생략.

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);
});

 

다만, 부동 소수점은 컴퓨터의 근본적인 특성상 소수점에서 정확도 차이가 날 수 밖에 없습니다.

toBeCloseTo를 사용하도록합시다.

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.
});

 

문자열 일치, 포함 판단

 

문자열은 iterable이긴 하지만 원시값이잖아요? toMatch(regex | string) 꼴로 사용하면 됩니다.

// 정규식 사용
test('there is no I in team', () => {
  expect('team').not.toMatch(/i/i); // case insenstive flags
});

// string도 됨
test('me and you', () => {
  expect('me and you').toMatch('you');
});

 

 

배열과 iterables

 

길이와 포함 여부를 판단할 수 있습니다.

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

test('the shopping list test', () => {
  expect(shoppingList).toHaveLength(5);
  expect(shoppingList).toContain('milk');
  expect(new Set(shoppingList)).toContain('milk');
});

// string은 iterable이니까 ㅎㅎ
test('string test', () => {
  const str = 'hello';
  expect(str).toHaveLength(5);
  expect(str).toContain('o');
});

 

exception

 

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 the exact error message or a regexp
  expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK');
  expect(() => compileAndroidCode()).toThrow(/JDK/);
});

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체