반응형
Error
sequelize을 통해서 test시 테이블을 생성하기 위해서 app.js 에서 아래와 같이 설정함.
db.sequelize
.sync({ force: false }) // true : 테이블을 재생성
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((err) => {
console.error(err);
});
그리고 테스트데이터를 사전에 insert하기 위해서 테스트코드(.spec.js)의 before에 아래와 같이 작성
const request = require('supertest');
const app = require('../app.js');
describe('GET /categories는', () => {
const category = [
{
id: 1,
nameKr: '카테고리명',
nameEng: 'categoryName',
}
];
before(() => {
app.models.Category.bulkCreate(category);
});
});
test를 실행해보니 아래와 같은 메시지와 함꼐 에러가 발생함.
2022-08-21 22:12:49:1249 error: relation "dadari-db.category" does not exist
2022-08-21 22:12:49:1249 error: Error
at Query.run (/Users/sungyoung/IdeaProjects/DADARI_API/node_modules/sequelize/dist/lib/dialects/postgres/query.js:50:25)
at /Users/sungyoung/IdeaProjects/DADARI_API/node_modules/sequelize/dist/lib/sequelize.js:313:28
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async PostgresQueryInterface.select (/Users/sungyoung/IdeaProjects/DADARI_API/node_modules/sequelize/dist/lib/dialects/abstract/query-interface.js:396:12)
at async Function.findAll (/Users/sungyoung/IdeaProjects/DADARI_API/node_modules/sequelize/dist/lib/model.js:1119:21)
at async Object.getMainSubscriptionService (/Users/sungyoung/IdeaProjects/DADARI_API/src/service/subscriptionService.svc.js:14:18)
at async /Users/sungyoung/IdeaProjects/DADARI_API/src/controller/subscriptionService.ctrl.js:113:26
반응형
Solution
메시지로 보아 api가 테스트되어 findAll에서 에러가난 것을 확인할 수 있음.
test로 spec.js파일이 먼저 실행되나 app.js를 먼저 실행하여 sequelize.sync을 먼저 실행하기 때문에 테이블이 생성되어 있을 것을 예상했으나 category테이블은 api 조회 시점에 생성되있지 않았는데, 그 이유가 sequelize.sync가 비동기 메소드이기 때문.
그래서 sequelize.sync에서 테이블을 생성하지만 생성을 기다리지 않고 바로 테스트 코드가 실행됨.
sequelize.sync를 기다리기 위해서 async await 등을 이용해서 메소드의 실행을 대기해야하는데,
app.js에서 test코드를 위해서 db sync를 강제로 await하는것을 불필요하다고 판단하여 테스트코드(.spec.js)에서 처리하기로 함.
app.js는 아래처럼 테스트코드가 아닐경우에만 sync를 실행.
if (process.env.NODE_ENV !== 'test') {
// test 코드에서 db sync를 await로 맞춤
db.sequelize
.sync({ force: false }) // true : 테이블을 재생성
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((err) => {
console.error(err);
});
}
.spec.js파일에서도 tes sync될 수 있도록 추가. sync를 대기하도록 async await도 추가
const request = require('supertest');
const app = require('../app.js');
describe('GET /categories는', () => {
const category = [
{
id: 1,
nameKr: '카테고리명',
nameEng: 'categoryName',
}
];
before(async () => {
await app.models.sequelize
.sync({ force: false })
.then(() => {
app.models.Category.bulkCreate(category);
})
.catch((err) => {
console.error('>>>>', err);
});
});
});
이렇게하면 테스트코드에서 테이블 생성 후, 테스트데이터 추가하여 테스트를 진행할 수 있다.
끝
Thank you!
반응형