묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
npm run test:e2e
수강생분들의 질문을 기다립니다! - 에러에 해당하는 질문은 "에러가 발생한 상황에 대한 충분한 설명", "에러 메세지", "에러가 난 코드 스크린샷"을 함께 첨부해주세요. - 언어에 해당하는 질문은 구글링 및 서치 후에 구체적으로 질문해주시면 좋습니다. - 간단한 진로 및 방향성에 대한 질문은 메일로 보내주세요.- 패키지 버전 관리은 실무 환경과 트랜드에 맞추어 강의를 업데이트 하고 있습니다. 강의를 그대로 따라갔는데 에러가 발생한다면 패키지 버전을 강의에서 사용하는 버전과 동일하게 맞춰주세요!- 강의 노트, QA 목록, 공지 사항을 먼저 확인해주세요.- 논리적이고 구체적인 질문은 학습 효과를 올립니다 :) 강의를 보시다가 혹시나 npm run test:e2e 를 돌려봤는데 npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! amamov.com@1.8.0 test:e2e: jest --config ./test/jest-e2e.jsonnpm ERR! Exit status 1npm ERR! npm ERR! Failed at the amamov.com@1.8.0 test:e2e script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR! /Users/anhyeongjun/.npm/_logs/2022-10-13T13_02_17_408Z-debug.log이런 error를 맞이하신다면 { "moduleFileExtensions": ["js", "json", "ts"], "rootDir": ".", "testEnvironment": "node", "testRegex": ".e2e-spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "moduleNameMapper": { "^src/(.*)$": "<rootDir>/../src/$1" } } moduleNameMapper이부분이 들어가있는지 확인하신 후 없으면 넣어주면 test가 성공적으로 진행될 수 있습니다. 다만 윤상석 선생님 추가해서 test를 돌려보면 Jest did not exit one second after the test run has completed.This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with --detectOpenHandles to troubleshoot this issue. 이런 오류가 나는데 이유가 무엇일까요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
mockReturnValue 질문
db 에러가 발생하면 next(error) 호출부분 질문드립니다. User.findOne부분을 mocking해서 reject를 반환하게 해서 에러처리하는 부분을 테스트하는것으로 이해를 하고 있습니다. user 컨트롤러에서 findOne이 reject를 반환하니, User.findOne({where: {id : req.user.id}}); 이 controller 코드에서 req.user.id가 필요없다고 생각하여 req 객체를 빈 객체로 만들고 테스트를 진행하니, req.user가 undefined라는 에러가 나오며 테스트가 실패하였습니다. 이 부분을 혹시 User.findOne 부분을 mocking 하더라도 findOne 함수 실행을 끝까지 하고 reject를 반환한다고 이해해도 되는것일까요? test("db 에러 발생하면 next(error)호출", async () => { const error = "error for test"; User.findOne.mockReturnValue(Promise.reject(error)); await addFollowing(req, res, next); // req = {}로 넣어도 되지 않을까? expect(next).toBeCalledWith(error); }); ////////////////////////////// exports.addFollowing = async (req, res, next) => { try { //질문대상인 User.findOne const user = await User.findOne({ where: { id: req.user.id } }); // req.user가 :id 사람을 팔로잉 한다. if (user) { await user.addFollowing(parseInt(req.params.id, 10)); res.send("success"); } else { res.status(404).send("no user"); } } catch (error) { console.error(error); next(error); } };
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
Post controller test 질문입니다.
exports.createPost = async (req, res, next) => { try { const post = await Post.create({ content: req.body.content, img: req.body.url, UserId: req.user.id, }); /////////////////// const hashtags = req.body.content.match(/#[^\s#]*/g); if (hashtags) { const result = await Promise.all( hashtags.map((tag) => { return Hashtag.findOrCreate({ where: { title: tag.slice(1).toLowerCase() }, }); }) ); ///////////// await post.addHashtags(result.map((r) => r[0])); } res.redirect("/"); } catch (error) { console.error(error); next(error); } }; 위 코드는 제가 post 라우터 unit test를 하기위해서 post를 생성하는 미들웨어를 controller로 분리한 코드입니다. 저기서 슬래시로 감싸진 부분을 어떻게 테스트를 해야할지 모르겠어서 질문드립니다. 또한 jest.mock("../models/post"); jest.mock("../models/hashtag"); const Post = require("../models/post"); const Hashtag = require("../models/hashtag"); 로 모델을 mocking하고 시작하였는데 User.hasMany called with something that's not a subclass of Sequelize.Model 라는 테스트 에러가 나와서, 왜 user model에 대한 부분이 에러로 나오는지 이해가 가지 않아서 질문드립니다. 여기 저기를 주석 처리한 결과 위 4줄의 코드가 에러의 원인인 것 같아 질문드립니다.
-
미해결따라하며 배우는 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)
-
미해결따라하며 배우는 리액트 테스트 [2023.11 업데이트]
jest와 @testing-library/jest-dom
너무 기초적인 질문인 것 같아 걱정이지만 질문드립니다~! 1. jest와 @testing-library/jest-dom는 어떤 차이가 있고 각각의 역할이 궁금합니다. 2. @testing-library와 함께 사용하는 이유와 jest만 따로 사용하지는 않는 이유가 궁금합니다.
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
Jest 테스트 코드 작성 관련 질문
타입스크립트로 Jest 테스트 코드를 작성해보고 있는데요. 유닛테스트를 작성하여, 직접 작성한 미들웨어에서 next() 함수가 호출되는지 확인해보려고 합니다. class-validator로 req.body가 number인지 검증하는 미들웨어이고, 테스트코드는 다음과 같습니다. import 'reflect-metadata'; import { CreateCheckInDto } from '../check-in/create-check-in.dto'; import { validation } from './validation.middleware'; describe('validation middleware', () => { it('simple test', () => { const req: any = { body: { cardId: '22' }, }; const res: any = {}; const next = jest.fn(); validation(CreateCheckInDto)(req, res, next); expect(next).toBeCalledTimes(1); }); }); 미들웨어 코드는 다음과 같습니다(class validator로 req.body를 검증하는 코드입니다). import { plainToInstance } from 'class-transformer'; import { validate, ValidationError } from 'class-validator'; import { NextFunction, Request, Response, RequestHandler } from 'express'; export function validation(type: any): RequestHandler { return (req: Request, res: Response, next: NextFunction) => { validate(plainToInstance(type, req.body)).then( (errors: ValidationError[]) => { if (errors.length > 0) { res.redirect('redirect'); } else { console.log('nextttttttttttttttt'); next(); } }, ); }; } console.log('nextttttttttttttttt'); 이게 콘솔로그로 찍히는 걸보면 next()부분까지 도달하는 것 같은데 테스트 결과는 기대와 다르게 아래와 같습니다. console.log nextttttttttttttttt at src/middleware/validation.middleware.ts:12:19 FAIL src/middleware/validation.middleware.spec.ts validation middleware ✕ simple test (22 ms) ● validation middleware › simple test expect(jest.fn()).toBeCalledTimes(expected) Expected number of calls: 1 Received number of calls: 0 13 | validation(CreateCheckInDto)(req, res, next); 14 | > 15 | expect(next).toBeCalledTimes(1); | ^ 16 | }); 17 | }); 18 | at Object.<anonymous> (src/middleware/validation.middleware.spec.ts:15:18) 왜 received number of calls가 0이 나오는지 실마리를 찾지 못하여 질문으로 올립니다. 원인해결을 위한 키워드라도 실마리를 주신다면 정말 감사하겠습니다!
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
fullstack 빌드시 아래와 같이 jest 에러가 나는데 혹시 해결방법이 있을까요
(사진)
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
테스트 파트의 user.test.js 오류가 나는데 도저히 이유를 모르겠습니다.
jest.mock("../models/user"); // require을 통해 가지고 오는 객체들을 jest.mock으로 복사한다. const User = require("../models/user"); const {addFollowing} = require("./user"); describe("addFollowing", ()=>{ const req = { user : {id : 1}, params : {id : 2}, }; const res = { status : jest.fn(()=>res), send : jest.fn(), }; const next = jest.fn(); const console = { error : jest.fn(), }; test("사용자를 찾아 팔로잉을 추가하고 success를 응답해야 함", async()=>{ User.findOne.mockReturnValue(Promise.resolve({ addFollowing(id) { return Promise.resolve(true); } })); await addFollowing(req,res,next); expect(res.send).toBeCalledWith('success'); }); test("사용자를 못 찾으면 res.status(404).send(no user)를 호출해야 함", async ()=>{ User.findOne.mockReturnValue(Promise.resolve(null)); await addFollowing(req.res,next); expect(res.status).toBeCalledWith(404); expect(res.send).toBeCalledWith('no user'); }); test("DB에서 에러가 발생하면 next(error) 호출한다.", async()=>{ const err = "테스트용 에러"; User.findOne.mockReturnValue(Promise.reject(err)); await addFollowing(req,res,next); expect(console.error).toBeCalledWith(err); expect(next).toBeCalledWith(err); }); } 위의 코드는 user.test.js 코드입니다. user.js 코드는 깃헙에 올려주신 코드를 복사했습니다. console.error()를 테스트 하기 위해 가짜객체도 만들었습니다. test("사용자를 못 찾으면 res.status(404).send(no user)를 호출해야 함" 이 부분에서 Promise.resolve(null)을 했는데 테스트가 왜 try{} 부분이 아니라 catch{} 부분으로 가는 걸까요?? catch{} 부분에서 console.error(err) 부분도 처리가 안되고 , next(err) 부분도 테스트가 안됩니다. next(err)에서 next가 함수가 아니라고 타입 에러가 뜨는데 왜일까요? 콘솔창의 출력은 다음과 같습니다. 혹시나 하는 마음에 user.js 코드도 아래에 올리겠습니다. const User = require('../models/user'); exports.addFollowing = async (req, res, next) => { try { const user = await User.findOne({ where: { id: req.user.id } }); if (user) { await user.addFollowing(parseInt(req.params.id, 10)); res.send('success'); } else { res.status(404).send('no user'); } } catch (err) { console.error(err); next(err); } }; ㅎㅎㅎ ㅎㅎㅎ
-
해결됨따라하며 배우는 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로 진행 중이라 몽구스로 변경하기가 어려운데 에러메시지 무시하면 될까요..?