강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

하루틴님의 프로필 이미지
하루틴

작성한 질문수

테스트 with Jest: 제로초에게 제대로 배우기

커버리지 100%를 향한 여정

jest.fn()으로 모킹 함수를 만들어 expect() 할 경우 undefined 출력됩니다

작성

·

84

·

수정됨

0

안녕하세요

현재 vue3로 구현된 프로젝트 내

로그인 성공 시 utils.js의 method3이 호출되는지 테스트를 하려고합니다

method3을 모킹함수로 대체하였는데

로그인 로직 내 method3을 콘솔로 찍어보면 undefined이 나와서 질문드립니다.

왜 method3이 undefined 가 나오는지 알려주실 수 있으실까요?

 

아래는 테스트 하기 위한 과정입니다.

1. 로그인 로직 중 utils.js의 method3을 호출하는 코드 존재

util.js

export const method1 = () => {
 ...
}

export const method2 = () => {
 ...
}

export const method3 = () => {
 ...
}

2. method3을 모킹 함수로 대체하려고 함

3. utils.js 파일이 위치하는 곳에 mocks 폴더를 만들어 아래와 같이 코드 작성

export default {

  ...jest.requireActual('../util'),

  method3: jest.fn()

}

4. 로그인 테스트 파일을 아래와 같이 작성

login.spec.js(테스트할 파일)

jest.mock('../common/util.js')

import { setActivePinia, createPinia } from 'pinia'

import * as fns from '../../common/util'

import { login } from '../../api/loginApi'

import { loginUser } from '../../store/authStore'

describe('로그인', ()=>{

 // userStore 내 loginUser 함수를 호출하기 위한 셋팅 
  let userStore 
  beforeEach(()=>{
    setActivePinia(createPinia())
    userStore = useAuthStore()
  })

  test('로그인 성공 시 성공 메시지 출력', async () => {
  // 로그인 성공 시 로그인한 사용자 정보 반환
  const mockResponse = {
     status : 200,
     data: {
        data: { 
           userName: 'test1'
        }
     } 
  }

 // 로그인 요청 api를 모킹함수로 대체
 await login.mockResovedValue(mockResponse) 

 // loginUser는 로그인 성공 시 유저 정보를 상태관리 변수에 저장
 await userStore.loginUser({userId : 'test1', password : 'test1pw'}) 

 expect(fns.method3).toHaveBeenCalled()

  })

})

 5. expect 부분에서 아래와 같이 오류 메시지가 발생합니다

expect(received).toHaveBeenCalledWith(...expected)

Matcher error: received value must be a mock or spy function

Received has value: undefined

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

하루틴님이 겪고 계신 문제는 Jest에서 jest.mock을 사용할 때, method3 함수가 제대로 모킹되지 않은 것 같습니다. 몇 가지 체크해야 할 사항을 알려드리겠습니다.

  1. 경로 확인: jest.mock('../common/util.js')에서 경로가 올바른지 확인하세요. 경로가 잘못되었다면 Jest가 해당 모듈을 찾을 수 없을 것입니다.

  2. 의존성 모킹: jest.mock을 사용할 때, 모듈을 올바르게 가져오고 있는지 확인하세요. common/util.js 내부에서 default export가 아닌 named export로 되어 있습니다. 따라서 jest.mock을 사용하면 모든 named export가 자동으로 모킹됩니다.

  3. 모킹 설정: method3을 모킹하는 부분이 Jest의 auto-mock과 충돌하여 의도대로 동작하지 않을 수 있습니다. 직접 함수의 모킹을 설정해보세요:

    jest.mock('../common/util', () => ({
     ...jest.requireActual('../common/util'),
     method3: jest.fn(),
    }));
    
  4. Mock 및 Spy 초기화: 각 테스트 전에 모킹을 초기화하거나 설정이 필요한 경우 beforeEach 내부에서 명확히 선언 및 초기화를 해주세요.

위 사항들을 점검해 보신 후에도 문제가 해결되지 않으면, method3이 호출되는 로그인 로직 또는 hook에서 어디서 정의되고 호출되는지를 추가로 검토해보시기 바랍니다. 도움이 되었기를 바랍니다! 😊

관련 문서를 참고하실 수 있도록 아래의 링크를 추가해 드립니다:
- Reference Documentation on Testing With a Mock Environment

Happy coding!

하루틴님의 프로필 이미지
하루틴

작성한 질문수

질문하기