jest spy를 사용한 테스트에서 테스트 순서에 따라 떨어지거나 떨어지지 않는 문제 해결

spy 로 toBeCalled() 를 사용한 테스트로, 테스트의 순서에 의존해 잘 움직이거나 움직이지 않거나 하는 현상이 있어, 빠질 것 같았기 때문에 기록해 둡니다.
테스트 대상은 TypeScript 의 함수입니다만, 형태가 있는 것을 제외하고는 JavaScript 로 읽어도 동일하다고 생각합니다.

테스트할 함수가 다음과 같다고 가정합니다.

export const targetFunction = (flag: boolean) => {
  if (flag) {
    console.error('出力です')
  }
}

실패한 패턴 테스트



import { targetFunction } from '~/plugins/axios'

const spyConsoleError = jest.spyOn(console, 'error')
spyConsoleError.mockImplementation(() => {
})

describe('spy resetの動作テスト', () => {
  test('console error が呼ばれる', async () => {
    await targetFunction(true)

    expect(console.error).toBeCalled()
  })

  test('console error が呼ばれないはず', async () => {
    await targetFunction(false)

    expect(console.error).not.toBeCalled()
  })
})


이것을 실행하면


대상 테스트 중에서는 console.error는 호출되지 않았지만 이미 이전 테스트에서 호출되었으므로 한 번 호출되었습니다.

잘 작동하도록 다시 작성된 패턴




import { targetFunction } from '~/plugins/axios'

const spyConsoleError = jest.spyOn(console, 'error')
spyConsoleError.mockImplementation(() => {
})

// ------  これを書き足します --------
beforeEach(() => {
  spyConsoleError.mockReset()
})
// ------  ここまで  ---------

describe('spy resetの動作テスト', () => {
 // 同じテスト
})


각각의 테스트 전에 beforeEach 로 초기화 처리를 해 주면 종속성의 문제가 일어나지 않습니다.

좋은 웹페이지 즐겨찾기