인프런 커뮤니티 질문&답변
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 함수가 제대로 모킹되지 않은 것 같습니다. 몇 가지 체크해야 할 사항을 알려드리겠습니다.
경로 확인:
jest.mock('../common/util.js')에서 경로가 올바른지 확인하세요. 경로가 잘못되었다면 Jest가 해당 모듈을 찾을 수 없을 것입니다.의존성 모킹:
jest.mock을 사용할 때, 모듈을 올바르게 가져오고 있는지 확인하세요.common/util.js내부에서default export가 아닌named export로 되어 있습니다. 따라서jest.mock을 사용하면 모든 named export가 자동으로 모킹됩니다.모킹 설정:
method3을 모킹하는 부분이 Jest의auto-mock과 충돌하여 의도대로 동작하지 않을 수 있습니다. 직접 함수의 모킹을 설정해보세요:jest.mock('../common/util', () => ({ ...jest.requireActual('../common/util'), method3: jest.fn(), }));Mock 및 Spy 초기화: 각 테스트 전에 모킹을 초기화하거나 설정이 필요한 경우
beforeEach내부에서 명확히 선언 및 초기화를 해주세요.
위 사항들을 점검해 보신 후에도 문제가 해결되지 않으면, method3이 호출되는 로그인 로직 또는 hook에서 어디서 정의되고 호출되는지를 추가로 검토해보시기 바랍니다. 도움이 되었기를 바랍니다! 😊
관련 문서를 참고하실 수 있도록 아래의 링크를 추가해 드립니다:
- Reference Documentation on Testing With a Mock Environment
Happy coding!





