44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결따라하며 배우는 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 업데이트]
bodyParser 대체에 관한 질문
안녕하세요, 강사님! 이전 강의에서 파서 부분을 app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(cookieParser()); 이렇게 세줄 세팅했었는데요, 이게 app.use(expess.json())이거 하나로 대체 가능한가요? 가능하다면 이전 프로젝트에서 저 세줄과 바디파서 디펜덴시를 지우고 하나로 대체해보고싶습니다!
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
Cannot log after tests are done. Did you forget to wait for something async in your test?
안녕하세요 강사님! 테스트 실행하면 통과하는데, 콘솔에 Cannot log after tests are done 가 뜨는 경우, "테스트가 끝난 후에 log 를 내보낼 수 없다"는 의미로 이해하고 있습니다. 이러한 경고(?)창을 안 뜨게 하는 방법이 있나요? 감사합니다
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
안녕하세요. 문의드립니다.
항상 좋은 강의 제공해주셔서 감사합니다. 다름이 아니라 항상 강의를 들으면 개인블로그에 정리를 하고 있습니다. 그래서 혹시 지금 이 강의도 제공해주신 자료 / 코드 등을 활용해서 따로 제가 공부한 내용을 정리해도 괜찮은지 궁금합니다. 출저는 명확하게 남기겠습니다!
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
mock 사용 관련
mock 을 한번 선언하면 테스트 전 구문에 영향을 끼쳐서 테스트가 잘 되지 않아 고심 중에 있습니다. const al = require('./al'); it('',()=>{ al.solve.mockReturnValue(1); }) 같은 식으로 하니 그외 모든 테스트에서도 al.solve 가 1을 리턴합니다. 그래서 afterEach에 al.solve.mockReset(); 를 해주었더니, 모두 null을 리턴합니다.. ㅜ ㅜ it~ 구문 테스트가 여러개 일 때, 한개의 it~ 테스트 구문안에서만 mock이 특정 역할을 하고 그 외의 it~ 테스트 안에서는 원래대로 함수를 호출하는 방법이 없을까요?
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
xml파일 여는 툴이 뭘까요?
pdf 자료도 잘 쓰고 있지만 xml 파일도 열어보고 싶은데 방법을 찾지 못해 질문 남깁니다.
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
syntax 관련 질문
const input = 'test'; describe('',()=>{ it("should be return proper result", (input) => { console.log(input) } }) 궁금해서 해보았는데요, it 구문에 ()=>{} 매개변수 입력시 테스트 케이스가 정상적으로 작동하지 않습니다. 이유 알 수 있을까요?
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
matcher 관련 질문입니다.
expect("1").toEqual("1")테스트 할 수 없나요? 항상 타임아웃 실패가 됩니다. 그리고 toEqual 과 toBe 의 차이도 알고 싶습니다.
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
에러처리를위한 단위테스트
안녕하세요 강의 잘 따라 듣고 있었는데 여기서 뭐가 잘못된건지 도저히 찾지를 못해서 질문드립니다. 강의에 나온 코드 그대로 작성하며 따라가는데 계속 TypeError가 납니다...
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
npm start 명령어가 어떻게 server.js를 찾아 실행하는가?
안녕하세요 이렇게 좋은 강의를 무료로 만들어 주셔서 감사합니다. Johnan님의 다른 강의도 유료로 구매하여 재미있게 공부중인 학생입니다 ^^ 강의를 따라하다가 발견했는데, pacakge.json에 script명령어에 "test": "jest"를 제외하고 아무런 스크립트를 작성하지 않았는데 'npm run start' 가 작동하는것을 발견했습니다. 구동원리에 대해 궁금합니다. npm run start를 하면 노드에서 내부적으로 express를 찾아서 실행해주는건가요?
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
integration 테스트시, 몽고디비에 데이트 업데이트 되는 이유.
안녕하세요. 수업 잘 듣고 있습니다. 궁금증이 생겨서 질문 남깁니다. 테스트시 결국에 디비와 의존성을 갖지 않기 위해 jest.fn()을 이용해서 유닛테스트를 진행하는 걸로 이해를 했는데, 그래서 디비에 데이터가 쌓이지 않아야 한다고 생각했는데, 강의 하신걸 보고 디비를 보니 데이터가 쌓여 있더라구요. 통합 테스트 과정에서 생긴 것 같은데, 통합 테스트 시에 생기는 이유는 실제로 post('/api/products') 이런식으로 요청을 날렸기 때문인가요? 유닛 테스트에는 실제로 요청을 날리는 부분이 없어서.. 그 차이가 무엇인가요?
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
Mongoose와 Jest
안녕하세요~ 현재 IT를 배우고 있는 학생으로서 좋은 강의를 듣게 되어서 감사 인사드립니다. 다름이 아니라, 저 같은 경우 몇 가지 문제가 발생(Mongoose version 관련)해서 Mongoose 홈페이지에 이러한 글을 찾게 되었습니다. "We strongly recommend using a different testing framework, like Mocha.". 그래서, 2가지 질문이 있습니다. 첫번째, MERN Stack 을 사용할 때, 각 파트별로 어떠한 Framework를 사용하면 좋은지 알려주시면 감사하겠습니다. 예를 들면 ReactJS를 사용할 때는 Jest 가 좀 더 효율이고 NodeJS를 사용하면 Mocha가 효율적이라든지... 두번째는, 이 강의가 끝나면 테스트를 더 깊게 배울려면 어떠한 것을 배우는 것이 좋은지 강사님의 의견을 듣고 싶습니다. 질문이 이상하더라도 학생이 바라보는 시점에서 질문했다고 생각하시고 너그럽게 이해 부탁드립니다 ^--^
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
expect(res.statusCode).toBe(500);
it('should handle errors', async () => { const errorMessage = {message: 'errors'}; const rejectedPromise = Promise.reject(errorMessage); Product.findByIdAndUpdate.mockReturnValue(rejectedPromise); await productController.updateProduct(req, res, next); expect(next).toHaveBeenCalledWith(errorMessage); // expect(res.statusCode).toBe(500); // Received: 200 }); server.js 에 작성된 오류 처리기에서는 500으로 처리하도록 되어 있는데, 위와 같이 500으로 처리되는지 확인해보면 200이 response되고 있습니다. next에 대한 테스트는 의도대로 되는 것으로 보아서 테스트는 문제가 없는 것 같은데, 왜 express 오류처리기의 response코드 500이 아닌 200으로 처리되는지 궁금합니다.
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
res._isEndCalled() 는 테스트를 못해보나요?
it('should return 404 when productId is not exist', async () => { const res = await request(app).get('/products/610a7f33b63caa3699ed9911'); expect(res.statusCode).toBe(404); // expect(res._isEndCalled()).toBeTruthy(); // 이건 왜 안될까요? }); 단위 테스트에서 수행하던 res._isEndCalled()는 node-mocks-http에서 createResponse()를 통해서 생성된 경우에만 테스트가 가능한 걸까요?
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
mongoose 6.0.2 버전 오류
안녕하세요 강의가 너무 좋아서 한번더 퀵하게 복습 중인데, 그 사이에 mongoose의 메이저버전이 6으로 올라갔습니다. getProducts 통합 테스트할때, 전체 테스트(npm test)를 하면 오류가 안나지만, jest extension을 이용해서 아래 테스트만 진행하면 오류가 나네요. it('GET /products', async () => { const res = await request(app).get('/products'); expect(res.statusCode).toBe(200); expect(Array.isArray(res.body)).toBeTruthy(); expect(res.body[0].name).toBeDefined(); expect(res.body[0].description).toBeDefined(); }); 검색해서 좀 알아봐도 뚜렷한 답이 안나와서 혹시 아시는 내용인지 문의 드립니다. 참고로 결과 공유 드립니다 ➜ tdd2 node '/Users/lyunhokim/dev/tdd2/node_modules/.bin/jest' '/Users/lyunhokim/dev/tdd2/test/integration/products.int.test.js' -t 'GET /products' console.log Server is running... at Server.<anonymous> (server.js:23:11) console.log connected at server.js:11:11 FAIL test/integration/products.int.test.js (5.734 s) ✕ GET /products (5007 ms) ○ skipped POST /products ○ skipped should return 500 on POST /products ● GET /products MongoInvalidArgumentError: Method "collection.find()" accepts at most two arguments at Collection.find (node_modules/mongodb/src/collection.ts:733:13) at NativeCollection.<computed> [as find] (node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:191:33) at NativeCollection.Object.<anonymous>.Collection.doQueue (node_modules/mongoose/lib/collection.js:135:23) at node_modules/mongoose/lib/collection.js:82:24 ● GET /products thrown: "Exceeded timeout of 5000 ms for a test. Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test." 22 | }); 23 | > 24 | it('GET /products', async () => { | ^ 25 | const res = await request(app).get('/products'); 26 | expect(res.statusCode).toBe(200); 27 | expect(Array.isArray(res.body)).toBeTruthy(); at Object.<anonymous> (test/integration/products.int.test.js:24:1) at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13) Test Suites: 1 failed, 1 total Tests: 1 failed, 2 skipped, 3 total Snapshots: 0 total Time: 5.778 s Ran all test suites matching /\/Users\/lyunhokim\/dev\/tdd2\/test\/integration\/products.int.test.js/i with tests matching "GET /products". 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.
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
선생님 안녕하세요
firstProduct의 데이터를 먼저 가져온다음에서야 GET /api/product/:productId 통합테스트가 통과가 되는데요 그럼 모든 테스트의 순서는 파일의 처음부터 파일의 끝 순으로 위아래로 차례로 실행이되는건가요 ??? 제가 자바 Junit할때는 랜덤으로 실행이됬던것같아서 Order라는 어노테이션을 따로 붙혀줬었던걸로 기억을해서요! 물론 자바는 이 강의와 전혀 무관한 내용인데 예를 들어서 죄송합니다 ㅠㅠ
- 해결됨따라하며 배우는 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 업데이트]
beforeEach 사용 이유에 관해 질문드려요~
``` let req, res, next;beforeEach(() => { req = createRequest(); res = createResponse(); next = null;}); ``` beforeEach 강의 에서 전역 컨텍스트에 대해 위 코드처럼 하라고 말씀해주셨는데, 특정 describe 안에서만 공유 되는 값에 어떤 동작을 해야할 땐 beforeEach를 사용해야 하지만 위 코드처럼 단순히 '모든 테스트에서 공유해야 하는 값' 을 정의하는건 ``` const req = createRequest();const res = createResponse();const next = null; ``` 그냥 이렇게 상수로 정의하면 되지 않나요? beforeEach를 사용해야만 하는 이유가 있는지 궁금해서 질문드려요. 좋은 강의 잘 보고 있습니다 감사합니다.
- 미해결따라하며 배우는 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; // 터미널
- 미해결따라하며 배우는 TDD 개발 [2023.11 업데이트]
강의 완료 다하고 선생님강의들으며 만들었던 유투브클론강의에 적용시킬려구합니다
៖여기서 tdd 적용시킬려면 controller 폴더를 만들어서 api하나당 exports 할수있게 만드는 방법 뿐인가요? 그리고 new Comment() 해서 만든 저 데이터쿼리문은 tdd할땐 create로 바꿔줘야하나요?