jest로 tc작성하기

iamsummer__·2020년 8월 19일
0

isArray라는 모듈을 개발하고 test case를 작성하던 중에 발생한 문제에 대해서 정리해보겠습니다.

export function isArray(arg) {
  if (Array.isArray) {
    return Array.isArray(arg);
  }
  return Object.prototype.toString.call(arg) === '[object Array]';
}

배열 여부를 반환해주는 간단한 함수입니다.
test case를 작성시 native Array.isArray의 존재여부에 따라 크게 2가지로 나뉩니다.

describe('isArray 기능 테스트', () => {
  describe('[native isArray] 타입 테스트', () => {
  // test구문 실행
  });

  describe('[native isArray 존재하지 않는 경우] 타입 테스트', () => {
  delete Array.isArray;
  // test 구문 실행
  });
});

위와 같이 실행을 하면 모든 test case는 Array.isArray가 존재하지 않는 경우의 코드를 타게 됩니다.
확인을 해보니 describe안에 선언된 내용은 test메서드가 실행하기 전에 실행이 되고 있습니다.
native isArray 존재하지 않는 경우에 첫번째 test 메서드내에서 delete Array.isArray를 하면 위에 native isArray test case는 정상동작하며 아래 native가 존재하지 않는 경우에도 정상동작합니다.
그러나 가독성 측면에서나 떨어지는것 같아 describe구문 안에서 delete Array.isArray 하는 방법을 찾아보려고 했으나 없는 것 같습니다.ㅠ

가장 간단한 방법은 test단위로 2가지 케이스로 나누는 것입니다.

describe('isArray 기능 테스트', () => {
  test('[native] isArray 타입별 테스트', () => {
    expect(isArray([])).toBe(true);
    expect(isArray([1, 2, 3])).toBe(true);
  });

  test('[native가 없는 경우] isArray 타입별 테스트', () => {
    delete Array.isArray;

    expect(isArray([])).toBe(true);
    expect(isArray([1, 2, 3])).toBe(true);
  });
});

그러나 사내 컨벤션이 존재하여 아래와 같이 작성하였습니다.
Array.isArray를 변수에 담아두고, native isArray가 존재하지 않는 경우에 첫번째 test구문에서 delete를 하고 afterAll에서 복구를 하였습니다.

const nativeIsArray = Array.isArray;

describe('isArray 기능 테스트', () => {
  describe('[native isArray] 타입 테스트', () => {
    test('[] 입력시, true 반환', () => {
      expect(isArray([])).toBe(true);
    });

    test('{} 입력시, false 반환', () => {
      expect(isArray({})).toBe(false);
    });
  });

  describe('[native isArray 존재하지 않는 경우] 타입 테스트', () => {
    test('[] 입력시, true 반환', () => {
      delete Array.isArray;

      expect(isArray([])).toBe(true);
    });

    test('{} 입력시, false 반환', () => {
      expect(isArray({})).toBe(false);
    });
  });
});

afterAll(() =>  {
  Array.isArray = nativeIsArray;
});

사실 아직까지 어느 방법이 맞는지는 정확히 모르겠습니다.
많은 분들의 의견 부탁드립니다.~ :)

profile
개발하는 프론트엔드개발자

0개의 댓글