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