수강생분들의 질문을 기다립니다! - 에러에 해당하는 질문은 "에러가 발생한 상황에 대한 충분한 설명", "에러 메세지", "에러가 난 코드 스크린샷"을 함께 첨부해주세요. - 언어에 해당하는 질문은 구글링 및 서치 후에 구체적으로 질문해주시면 좋습니다. - 간단한 진로 및 방향성에 대한 질문은 메일로 보내주세요. - 패키지 버전 관리은 실무 환경과 트랜드에 맞추어 강의를 업데이트 하고 있습니다. 강의를 그대로 따라갔는데 에러가 발생한다면 패키지 버전을 강의에서 사용하는 버전과 동일하게 맞춰주세요! - 강의 노트, QA 목록, 공지 사항을 먼저 확인해주세요. - 논리적이고 구체적인 질문은 학습 효과를 올립니다 :) 강의를 보시다가 혹시나 npm run test:e2e 를 돌려봤는데 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! amamov.com @1.8.0 test:e2e: jest --config ./test/jest-e2e.json npm ERR! Exit status 1 npm 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. 이런 오류가 나는데 이유가 무엇일까요?
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 ); } };
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줄의 코드가 에러의 원인인 것 같아 질문드립니다.
저만 그런건지 모르겠지만 아래 환경에서 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-app cd my-app npm i 를 이용해서 프로젝트를 셋업하고 작성하시면 됩니다. 커뮤니티에도 올려두었는데 문제 되는 부분 있으면 댓글 부탁드립니다. ES6 Express Jest Boilerplate Template ES6 익스프레스 보일러플레이트 탬플릿 - 인프런 | 자유주제 (inflearn.com)
너무 기초적인 질문인 것 같아 걱정이지만 질문드립니다~! 1. jest와 @testing-library/jest-dom는 어떤 차이가 있고 각각의 역할이 궁금합니다. 2. @testing-library와 함께 사용하는 이유와 jest만 따로 사용하지는 않는 이유가 궁금합니다.
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로 진행 중이라 몽구스로 변경하기가 어려운데 에러메시지 무시하면 될까요..?