묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] 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로 진행 중이라 몽구스로 변경하기가 어려운데 에러메시지 무시하면 될까요..?