inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

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

미해결

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

안녕하세요 현재 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

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
하루틴 댓글 1 좋아요 0 조회수 120

클래스는 어떻게 모킹하나요?

미해결

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

클래스를 모킹할 때도 jest.mock을 사용하나요? 아니면 다른 방법이 있나요?

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
정진호 댓글 1 좋아요 0 조회수 170

호출 순서 테스트, mock 객체, jest-extended 강의 내용중 TypeError가 나는데요!ㅠㅠ

미해결

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

package.json { "name": "jest-lecture", "version": "1.0.0", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "description": "", "devDependencies": { "@types/jest": "^29.5.14", "jest": "^29.7.0", "jest-extended": "^4.0.2", "ts-jest": "^29.2.5" } } global.d.ts import "jest-extended"; tsconfig.json { "files": ["global.d.ts"] } jest.config.js /** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { testEnvironment: "node", transform: { "^.+.tsx?$": ["ts-jest", {}], }, setupFilesAfterEnv: ["./testSetup.js"], }; testSetup.js const matchers = require("jest-extended"); expect.extend(matchers); 위의 환경에서 설정하였으며 src/order.test.ts에서 import { first, second, third } from "./order"; test("first->second->third", () => { const spy1 = jest.fn(first); const spy2 = jest.fn(second); const spy3 = jest.fn(third); spy1(); spy2(); spy3(); console.log(spy1.mock.invocationCallOrder[0]); console.log(spy2.mock.invocationCallOrder[0]); console.log(spy3.mock.invocationCallOrder[0]); // expect(spy1.mock.invocationCallOrder[0]).toBeLessThan( // spy2.mock.invocationCallOrder[0] // ); // expect(spy3.mock.invocationCallOrder[0]).toBeGreaterThan( // spy2.mock.invocationCallOrder[0] // ); expect(spy1).toHaveBeenCalledBefore(spy2); expect(spy3).toHaveBeenCalledAfter(spy2); }); 위처럼 테스트를 실행하면 ● first->second->third TypeError: expect(...).toHaveBeenCalledBefore is not a function 19 | // spy2.mock.invocationCallOrder[0] 20 | // ); > 21 | expect(spy1).toHaveBeenCalledBefore(spy2); | ^ 22 | expect(spy3).toHaveBeenCalledAfter(spy2); 23 | }); 24 | at Object.<anonymous> (src/order.test.ts:21:16) 위와 같은 타입오류가 나오고있는데요, 무엇때문에 오류가 나는지 모르겠습니다ㅠㅠ

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
simjieun 댓글 1 좋아요 0 조회수 158

모듈 모킹 시 메소드 동작 문제

미해결

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

https://github.com/ayden94/jestTest src/module.spec.ts에서 jest.mock('./module')를 하면, 모듈이 이상하게 모킹되는 듯합니다. 메소드가 존재는 하지만, 호출할 경우 완전히 말이 안 되는 결과를 리턴해서 toBe가 항상 틀린 것으로 결과가 나옵니다. 모듈 모킹 시도 없이 모듈 그 자체를 가지고 테스트를 해보면 문제가 없는데, 꼭 모듈을 모킹하면 문제가 생깁니다. 고민해봤지만 원인을 모르겠습니다. 확인 부탁드립니다.

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
정진호 댓글 1 좋아요 0 조회수 179

영속성 객체 구분으로 인한 JPA와 Querydsl의 Projection 사용

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

지금은 간단한 예제라 엔티티에서 JpaRepository를 사용하여 데이터를 가공해서 가져온 후 도메인 객체로 매핑시켜 controller에 넘겨 controller에서 response 객체로 변환시켰습니다. 만약 Projection을 사용하는 경우 Projection에서 바로 controller 패키지 안의 response 패키지 객체로 접근하는 것은 어떻게 생각하시나요?

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
캄캄한인생 댓글 1 좋아요 0 조회수 235

비동기 함수 테스트 중 특정 케이스 에러

미해결

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

비동기 함수 테스트 강의를 따라했을 때 제 컴파일러에서는 오류가 발생합니다. 다른 테스트 케이스들 말고 아래 두 케이스에서만요. test('okPromise 테스트', () => { const okSpy = jest.fn(okPromise); return okSpy.then((result) => { expect(result).toBe('ok'); }) }) test('noPromise 테스트', () => { const noSpy = jest.fn(noPromise); return noSpy.catch((result) => { expect(result).toBe('ok'); }) }) 각 테스트 별 에러 메세지는 다음과 같습니다. 'Mock<Promise<string>, [], any>' 형식에 'then' 속성이 없습니다.ts(2339) 'Mock<Promise<never>, [], any>' 형식에 'catch' 속성이 없습니다.ts(2339) 코드를 동일하게 작성했음에도 불구하고, 어떤 문제로 위 에러가 발생하는 걸까요?

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
모락 댓글 1 좋아요 0 조회수 206

인프라계층 구현체와 테스트 구현체에 대한 질문

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

안녕하세요. UserRepository 를 구현하는 구현체로는 UserJpaRepository 를 사용하는 UserRepositoryImpl 와 테스트용 구현체인 FakeUserRepository 가 있는데요. TDD라는게 단순 객체지향적인 설계를 잘하는 방법론이라면 납득이 가는데, 실제 서비스 되어야 할 코드가 잘 동작하는지 검증하기 위함이라는 관점에서는 조금 궁금한점이 생겨 질문드립니다. FakeUserRepository 는 UserRepository 의 계약을 잘 이행하고 테스트도 성공하도록 잘 구현하였습니다. 그런데 실제 서비스에 사용될 UserRepositoryImpl 는 한번도 검증된 적 없는데 테스트를 통해 어떻게 소프트웨어가 변화함에 있어서 확신을 가질 수 있나요? UserRepositoryImpl 내부 구현이 변경되었을때 여전히 FakeUserRepository 만 테스트를 실행할텐데 어떤식으로 개발 과정에서 확신을 얻을 수 있는지 궁금합니다. 추가적으로 TDD의 역할에는 어떤 구현 기술에 대해 잘 사용되었는지에 대한 검증은 포함되지 않나요? 예를 들어 스프링 데이터 JPA를 잘 사용하였는지..? 예를 들자면 저는 TDD를 해본적은 없지만 실제 실행되는 인프라 계층을 실행해볼 수 있는 샘플 테스트코드 개념으로 만들어서 사용하고 있는데요. 제가 개발하고 있는 기업용 솔루션이 버전이 높아짐에 따라 워낙 무거워져서 로컬 PC에서 WAS를 기동하는데에만 2분이 넘기 때문에 최소한의 인프라계층 혹은 인프라계층의 협력 클래스들정도는 테스트 코드로 직접 테스트해볼 수 있도록 테스트 코드를 작성해 두었습니다. 이렇게 해두면 어떤 이슈가 발생했을때도 곧바로 쉽게 테스트가 가능하니까요. 물론 DB 개발서버 장비에 연결하고 더미데이터를 가지고 실행하는 식으로요. 이번 강의에서 H2를 통한 인프라 테스트 강의까지가 딱 제가 하고 있는 테스트들이었는데요. 중간에 놓친것인지 테스트가 무거워진다는 설명만 하고 그뒤로는 리팩토링과 함께 인프라 레벨의 테스트는 언급을 안하셔서 제가 생각하는 구현 기술을 잘 사용하여 실제 서비스되는 인프라 모듈을 직접 테스트 하는 부분은 어떻게 해야할지 궁금합니다.

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
dlsrksrhk 댓글 1 좋아요 0 조회수 237

TS로 변경 시 "type": "module" 제거 이유가 궁금합니다.

미해결

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

확장자를 TS로 변경했을 때 코드에는 ESM의 import , export 를 사용했는데 왜 package.json파일의 ESM 관련 옵션인 "type": "module" 을 제거하는지 궁금합니다. GPT의 답변에 의하면 TS 파일은 컴파일 과정에서 CommonJS나 ESM이나 알맞게 변환을 하기 때문에 해당 옵션이 필요 없고, Jest와의 호환성을 위해 "type": "module" 을 제거해주는 것이고, JS파일은 기본적으로 CommonJS모듈 시스템을 사용하기 때문에 import문을 사용했으면 ESM방식으로 해석하도록 명시하기 위해서 "type": "module" 을 추가한다. 라고 설명을 해주는데 그럼 JS 파일의 경우 Jest와의 호환성을 고려하지 않는건지.. 이해가 잘 되지 않습니다. 혹시 설명을 해주실 수 있을까요?

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
모락 댓글 2 좋아요 0 조회수 330

jest.config.js 파일 내용 다른 분들 참고

미해결

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

환경 : mac os 저의 경우에 npx ts-jest config:init 명령어를 통해 생성한 jest.config.js 파일의 내용이 다음과 같이 강의 영상과 달랐습니다. /** @type {import('ts-jest').JestConfigWithTsJest} **/ module.exports = { testEnvironment: "node", transform: { "^.+.tsx?$": ["ts-jest",{}], }, }; 강의 영상 내용에 맞춰서 preset: 'ts-jest' 설정을 추가해주어 Jest가 TypeScript 파일을 컴파일하고 실행할 수 있도록 해주니 잘 동작합니다.

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
댓글 2 좋아요 0 조회수 354

강의 교안

미해결

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

안녕하세요 제로초님. 강의 교안이 어디있는지 모르겠습니다.

  • supertest
  • jest
  • 소프트웨어-테스트
  • unittest
gomteng03 댓글 2 좋아요 0 조회수 280

실습 코드 커밋

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

커밋을 강의 중간에 계속 하던데 깃허브에는 커밋이 한개밖에 없네요 어떻게 알수있을까요

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
김혁준 댓글 1 좋아요 0 조회수 394

UserEntity 메서드

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

좋은 강의 감사합니다. UserEntity 클래스에 있는 from 메서드는 static, toModel 메서드는 그렇지 않습니다. 둘의 차이와 from 메서드를 static 으로 설정한 이유가 있을까요?

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
highjune 댓글 2 좋아요 0 조회수 307

CertificationServiceTest에서 MailSender 인터페이스가 아닌 FakeMailSender를 이용하는 것

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

현재 CertificationServiceTest를 할 때 MailSender를 주입받는 것이 아닌 FakeMailSender를 주입받아서 테스트를 진행하는데 MailSender를 만든 이유가 의존성을 역전시키기 위해서 만든 것인데 FakeMailSender를 사용하게 되면 의존성 역전 원칙이 적용된 것이 아니지 않나요??? FakeMailSender는 mock으로 사용하고 있지만 구현체이니까 MailSender를 사용해야 되는 것이 아닌가요?? 그냥 테스트 목적으로 필드 값들이 잘 전달되는지 확인하기 위해서 사용하기 때문에 상관이 없는 건지 궁금합니다. MailSender 인터페이스를 이용한다면 검증 부분에서 다운 캐스팅을 해줘야 하기 때문에 사용하지 않은 건가요???

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
햄토리 댓글 1 좋아요 0 조회수 233

레이어드 아키텍처 개발에 대하여

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

섹션 6 진화하는 아키텍처의 3번째 강의인 핵사고날에 대한 사견 강의 중 8분 9초에 강사님께서 시스템이 명확할 때, 추상화가 너무 많이 되어있다면 쓸모없는 구역이라고 말씀하시고 Spring/JPA/RDB 이 3개를 쓸게 명확하다면 레이어드 아키텍처로 개발하라고 말씀하셨는데 그럼 기술 스택이 명확한 상황이라서 레이어드 아키텍처로 개발을 시작하게 된다면 전체적인 강의 통틀어서 말씀하셨던 의존성 역전, JPA에 종속적인 문제, 도메인 중점 개발 이런 것들이 필요 없어지게 되는걸까요? 레이어드 아키텍처 개발이든 핵사고날 아키텍처로 개발을 하든 도메인을 중심으로 개발하는 것이 중요하다고 생각합니다. 하지만 의존성 역전으로 인한 추상화나 그로 인한 테스트 작성이 쓸모가 없어지게 되는걸까요?

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
springYam 댓글 1 좋아요 0 조회수 241

BDDMockito의 when을 사용한 코드가 given 절에 있는 이유가 궁금합니다.

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

섹션3 - 테스트추가하기: h2를 이용한 service 테스트 에서 UserService 의 create 를 테스트하기 위해 Mock으로 주입된 JavaMailSender 의 send 를 다음과 같이 given 절에 추가하셨습니다. https://tecoble.techcourse.co.kr/post/2020-09-29-compare-mockito-bddmockito/ 에 따르면 BDDMockito는 given-when-then 구조의 시나리오 기반 테스트를 진행할 때, 시나리오에 맞게 테스트가 읽힐 수 있도록 도와주는 역할이라고 하였습니다. 따라서 저는 해당 코드를 when 절에 추가하였는데, 다른 분들은 어떤 의견이신지 궁금합니다...!

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
cho766 댓글 1 좋아요 0 조회수 242

테스트에서 주입과 생성

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

안녕하세요 좋은 강의 잘 듣고 있습니다. 사소한 질문이지만요..! <테스트 추가하기:mockmvc 를 이용한 controlelr 테스트 강의> 의 13:00 에서요 ObjectMapper 를 @Autowired 로 주입받아서 쓰지 않고 생성하셔서 쓰는 이유가 있을까요? 각각은 어떻게 다르고 장단이 있나요. 미리 감사합니다.

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
highjune 댓글 1 좋아요 0 조회수 217

프로젝트 코드는 제공해주시지 않는건가요?

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

안녕하세요? 강의 잘 듣고 있습니다 강의보면서 코드를 따라치고 싶은데, 코드는 따로 제공되지 않는건가요?

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
댓글 2 좋아요 0 조회수 403

개선된 아키텍처의 구조

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

많은 도움을 얻어가는 취준생입니다. 다름아니라 본 영상( 레이어드 아키텍처의 문제점과 해결책) 9분30초의 구조는 DDD라고 볼 수 있나요? 감사합니다.

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
Bax 댓글 1 좋아요 0 조회수 283

서비스 레이어의 단위 테스트 범위 고민

미해결

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

테스트 중에 고민되는 부분이 생겨서 문의드립니다. A서비스의 a()메서드에서 B서비스의 b()메서드를 호출하고 있고, B서비스의 b()메서드에 대한 단위 테스트가 이미 완료된 상황을 예시로 들겠습니다. 이미 b()메서드에 대한 테스트는 끝났으니, A서비스 단위 테스트 시 a()가 b()를 호출해서 생기는 결과에 대해서는 따로 검증이 필요하지 않을까요? 저는 b()를 호출하는 것까지가 a()의 책임이기 때문에 a()를 테스트하려면 b() 호출에 따른 검증 과정도 필요하다고 생각됩니다. 하지만 이 경우 여러개를 의존하는 클래스에 대한 테스트 시, assertThat()과 같은 검증 코드 및 테스트 코드가 뚱뚱해지는 일이 발생합니다. 혹은 테스트 시 a()에서 B서비스의 b()를 호출했는 지에 대해 Mock라이브러리의 verified를 통해 검증 가능한 것으로 알고있는데, 모키토 같은 외부 라이브러리를 사용하지 않고 테스트를 작성하고 싶어 고민됩니다. 결국 A서비스를 단위 테스트할 때 어디까지 테스트하는 것이 적절한 책임 분배?인지 알고 싶습니다.

  • spring
  • tdd
  • jpa
  • 소프트웨어-테스트
  • unittest
rlawnsdud920 댓글 1 좋아요 0 조회수 197

인기 태그

인프런 TOP Writers

주간 인기글