묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결테스트 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)코드를 동일하게 작성했음에도 불구하고, 어떤 문제로 위 에러가 발생하는 걸까요?
-
미해결테스트 with Jest: 제로초에게 제대로 배우기
TS로 변경 시 "type": "module" 제거 이유가 궁금합니다.
확장자를 TS로 변경했을 때 코드에는 ESM의 import, export를 사용했는데 왜 package.json파일의 ESM 관련 옵션인 "type": "module"을 제거하는지 궁금합니다. GPT의 답변에 의하면TS 파일은 컴파일 과정에서 CommonJS나 ESM이나 알맞게 변환을 하기 때문에 해당 옵션이 필요 없고, Jest와의 호환성을 위해 "type": "module"을 제거해주는 것이고,JS파일은 기본적으로 CommonJS모듈 시스템을 사용하기 때문에 import문을 사용했으면 ESM방식으로 해석하도록 명시하기 위해서 "type": "module"을 추가한다.라고 설명을 해주는데 그럼 JS 파일의 경우 Jest와의 호환성을 고려하지 않는건지.. 이해가 잘 되지 않습니다. 혹시 설명을 해주실 수 있을까요?
-
미해결테스트 with Jest: 제로초에게 제대로 배우기
jest.config.js 파일 내용 다른 분들 참고
환경 : 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 파일을 컴파일하고 실행할 수 있도록 해주니 잘 동작합니다.
-
미해결테스트 with Jest: 제로초에게 제대로 배우기
강의 교안
안녕하세요 제로초님. 강의 교안이 어디있는지 모르겠습니다.
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
TypeError: user_model_1.default.create is not a function
학습중 repository pattern을 적용하여 테스트를 적용해 보던 중 TypeError: user_model_1.default.create is not a function 라는 에러와 마주하게 되었습니다.user.repository.tsimport User from "../model/user.model"; export class UserRepository { createUser = async(user) => { const newUser = await User.create({ ...user }) return newUser } findUserById = async(id:string) => { const user = await User.findById('65cba34813b2fbec74a558a8') if(!user) throw new Error('존재하지 않는 유저정보 입니다.') return user } }user.repository.test.tsimport { UserRepository } from "../../app/repository/user.repository" const createMock = jest.fn() const findByIdMock = jest.fn() jest.mock("../../app/model/user.model", () => { return { User: jest.fn(() => { return { create:createMock, findById:findByIdMock } }) } }) describe('user repository Create', () => { let sut:UserRepository; const newUser = { id:"abcdefrwgsf123123", name:"test name", email:"test@nanana.com" } beforeEach(() => { sut = new UserRepository() }) afterEach(() => { jest.clearAllMocks() }) it('create api', async () => { createMock.mockReturnValueOnce(newUser) const actual = await sut.createUser({name:newUser.name, email:newUser.email}) expect(createMock).toHaveBeenCalledTimes(1) expect(actual).toStrictEqual(newUser) expect(createMock).toHaveBeenCalledWith({name:newUser.name, email:newUser.email}) }) }) jest실행시 create api의 createMock.mockReturnValue() 까지는 실행이되지만 await sut.createUser() 부분에서 에러가 나는것으로 확인되었습니다.
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
에러 처리를 위한 단위테스트 작성
에러 처리를 위한 단위테스트 작성 강의 내용 중 이해가 가지 않는 부분이 생겨 글 남김니다.errorMessage 의 message 내용은 description property missing 에러입니다. 그렇다면 테스트 상황에서 포스트맨과 동일하게 description이 빠진 객체를 저장하다 에러가 발생해야 맞는 테스트가 아닌가 하는 의문이 생기네요.it('should handle errors', async () => {const errorMessage = {message: "description property missing"}; const rejectedPromise = Promise.reject(errorMessage); productModel.create.mockReturnValue(rejectedPromise); await controller.createProduct(req, res, next); expect(next).toBeCalledWith(errorMessage);})
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
res.status(201) 부분에서 typeerror가 발생합니다
에러메시지: TypeError: Cannot read properties of undefined (reading 'status')res.status(200); 해당 코드에서 발생하는 에러인데 강사님이 코드돌리실때는 해당 에러가 발생하지 않는데 제 pc에서는 왜 에러가 발생하는지 잘 모르겠습니다...코드는 강의에서 입력하신 그대로 따라서 했습니다
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
따라하며 배우는 TDD 개발 [2023.11 업데이트] 강의 질문
따라하며 배우는 TDD 개발 [2023.11 업데이트]2023.11 업데이트라고 되어 있는데, 이게 업데이트 반영 된건가요?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
테스트를 위한 데이터베이스를 생성해야하나요?
운영 단계에서의 데이터베이스와개발 단계에서의 데이터베이스를 분리하여 운영한다고 하면,테스트를 위한 데이터베이스도 만들어야할까요?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
Postman 사용방법에 대해서
안녕하세요 Postman을 윈도우에서 깔아서 쓰려고 하는데 자꾸만 셋업로그가 잘못되었다고 에러가 뜹니다. 다시 시도해 봐야 하나요? 아니면 postman을 launch부터 하고 나서 깔아야 하나요? 참고로 postman을 launch하고 나서 또 다시 다운로드 시도해봤습니다.
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
jest.fn() 을 할당할때 타입스크립트에서 에러가 발생합니다.
Typescript를 쓰면서 공부중입니다. productModel.create = jest.fn();위 코드를 할당할 때Cannot assign to 'findByUsername' because it is a read-only property.라는 컴파일 에러가 발생합니다...타입스크립트에서는 어떻게 할당하면 될까요 ?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
라우터를 돌릴 때
안녕하세요. 어제 알려주신 대로 제어판에서 다시 편집하고 npm run start까지 돌리는 것 까지는 잘 되었습니다. 근데 문제는 chrome에 localhost:5000을 쳤을 때는 잘 나왔지만 localhost:5000/api/products라고 칠 때는이렇게 뜹니다.이거는 단순한 코딩 문제인가요? 아니면 제가 잘 못따라 오고 있는건가요?그리고 MongoDB 새로 가입했을 때 제가 뭔가 실수한 거 같은데, MongoDB 쪽 스킵하고 Jest쪽만 들어도 상관없나요? 아니면 MongoDB도 순차적으로 들어야 하나요?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
node.js에 대한 이상점
안녕하세요. 어제 강의에서 알려주신대로 node.js를 설치하고 npm init, npm install express mongoose --save, npm install jest supertest node-mocks-http --save-dev까지 설치해서 실행까지 했는데, 문제는 테스트를 실행할 때, 버전이 맞지 않는다고 테스크 결과 자체가 뜨지 않는다는 겁니다. 제가 현재 윈도우를 쓰고 있는데 강의하고 있는 컴터는 맥북이라 달라서 그런지 조금 헷갈립니다. 기존에 작업했던거 전부 삭제하고 다시 깔아야 하낭요? 일단 제가 node.js를 깔았을때 node_modules가 폴더 형식으로 뜨고, package.json은 빨간 문양이 뜹니다.
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
nodemocks 오류나니까 뺴고 설치하셔요
npm i jest supertest --save-devnpm install --save-dev node-mocks-httphttps://www.npmjs.com/package/node-mocks-http
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
ES6 사용하고 싶은 분들...
저만 그런건지 모르겠지만 아래 환경에서 jest.fn() is not function 에러가 발생하고 있습니다. 1. Express.JS 사용 중 2. ES6 문법을 사용 중 3. package.json 에 "type":"module" 옵션 추가 4. 그로 인해 import 구문의 './파일명.js' 로 작성해야함 5. package.json 의 script 항목의 "test" : "jest" 를 아래로 변경 "node --experimental-vm-modules node_modules/jest/bin/jest.js" 에러 발생 원인은 '.js' 부분 떄문이라고 추측하지만 정확하지 않습니다. 떠힌 Jest NODEModules 기능은 실험적 기능이며, 몇몇 기능이 지원되지 않는 것이라고 추측하고 있습니다.따라서 dev 환경에서는 ES6 를 쓰도록 별도로 셋업하고 ES5 로 빌드 하는 과정이 필요한 것이 아닌가 싶었습니다.git clone https://github.com/unchaptered/express-web my-app 혹은npx degit unchaptered/express-web my-appcd my-appnpm i를 이용해서 프로젝트를 셋업하고 작성하시면 됩니다.커뮤니티에도 올려두었는데 문제 되는 부분 있으면 댓글 부탁드립니다. ES6 Express Jest Boilerplate Template ES6 익스프레스 보일러플레이트 탬플릿 - 인프런 | 자유주제 (inflearn.com)
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
통합 테스트에 관한 질문 이 있습니다.
안녕하세요 강사님 강의를 따라하며 통합테스트에 다음과 같은 코드에서 의문점이 생겼습니다. 통합테스트에서 데이터를 update나 delete를 할때 실제 db에 있는 데이터가 수정,삭제가 되는것을 확인했습니다. 지금은 TDD개발이라 테스트중에 사용되는 데이터라 상관이 없겠지만 만약에 실제 서비스중이거나 중요한 데이터를 다루는 api에 대한 통합 테스트를 할때에는 서비스 db의 의존성없이 가짜 데이터로 테스트를 해야하는데 통합테스트를 할때 그렇게 하는 방법은 없나요?? it('PUT /api/products', async () => { const res = await request(app) .put('/api/products/' + firstProduct._id) .send({ name: 'updated name', description: 'updqted discription' }); expect(res.statusCode).toBe(200); expect(res.body.name).toBe('updated name'); expect(res.body.description).toBe('updqted discription'); });
-
해결됨따라하며 배우는 TDD 개발 [2023.11 업데이트]
mysql import 에러
mysql을 사용하여 진행 중인 프로젝트가 있는데 tdd를 적용해보려고 합니다. controllers/subscription.js const db = require('../routes/database.js'); exports.subscribeCalendar=()=>{}; 컨트롤러 코드는 위와 같고 test/unit/subscription.test.js const subscriptionController=require("../../controllers/subscription") describe("캘린더 구독",()=>{ test("subscribeCalendar 함수가 있을 겁니다.",()=>{ // subscriptionController.subscribeCalendar의 타입은 함수다. expect(typeof subscriptionController.subscribeCalendar).toBe("function") }) }) 테스트 코드는 위와 같은데 컨트롤러에서 db를 임포트 하기 전에는 에러가 안 떴는데 임포트 한 후에 테스트는 통과하지만 아래와 같은 에러 메시지가 뜹니다. 검색해보니 단위테스트 할 때는 db 관련 코드는 넣지 말라고 하는데 그 원인일까요? ReferenceError: You are trying to `import` a file after the Jest environment has been torn down. 이미 mysql로 진행 중이라 몽구스로 변경하기가 어려운데 에러메시지 무시하면 될까요..?
-
미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
통합테스트 에러 해결 방법
현재 Create 통합 테스트 작성의 통합 테스트 작성하기 까지 다 들은 상태인데요, 분명 똑같이 따라했는데 A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks. 위의 에러 메세지가 뜨더라고요.. 구글링해서 package.json에 "test": "jest --runInBand --detectOpenHandles" 이렇게 해줬는데 이렇게 하니까 이번엔 ReferenceError: You are trying to `import` a file after the Jest environment has been torn down. 이 에러가 뜹니다;; 계속 구글링해보고 있긴한데 해결이 안되서 질문 남깁니다. // test/integration/products.int.test.js const request = require('supertest'); const app = require('../../server'); const newProduct = require('../data/new-product.json'); it("POST /api/products", async () => { const response = await request(app) .post("api/products") .send(newProduct); expect(response.statusCode).toBe(201) expect(response.body.name).toBe(newProduct.name) expect(response.body.description).toBe(newProduct.description) }) // server.js const express = require('express'); // Constants const PORT = 5000; // App const app = express(); const productRoutes = require('./routes') const mongoose = require('mongoose'); const user = 'databaseuser'; const password = 'young4262'; const db = 'ttd'; mongoose.connect(`mongodb+srv://${user}:${password}@cluster0.1weod.mongodb.net/${db}?retryWrites=true&w=majority`, { useNewUrlParser: true, // 경고 문구 뜨지 않게 useUnifiedTopology: true }) .then(() => console.log('Mongodb Connected...')) .catch(err => console.log(err)); app.use(express.json()); app.use('/api/products', productRoutes) app.get('/', (req, res) => { res.send('Hello') }) app.listen(PORT, () => console.log(`Running on port ${PORT}`)); module.exports = app; // 터미널