Super Oak로 테스트 코드 작성하기
Super Oak 테스트에 도입했습니다. 부분만 적용할 수 있었습니다. 하지만 이 라이브러리에 메인테이너가 없는 것 같습니다.
인정하겠습니다. deno는 fresh를 제외하면 시기상조입니다. Nest.js를 배우고 포팅하고 십네요.
Super Oak 테스트 도입 시도
저의 테스트 불가능하게 느껴지는 백엔드에 테스트 코드를 추가해보기 위해 시도합니다.
import { helpers } from '../deps.ts';
import type { Context } from '../deps.ts';
import MongoAPI from '../api/mongoAPI.ts';
import CardRecord from '../model/cards.ts';
const mongoAPI = MongoAPI.getInstance();
async function addCard({ request, response, state }: Context) {
try {
if (!request.hasBody) throw Error('No Data');
const userId = state.userId ?? '';
const { question, answer, submitDate, stackCount } = await request.body()
.value;
if (!question || !answer || !submitDate || stackCount === undefined)
// stackCount의 0은 falsy 하기 때문에 undefined으로 활용
throw Error(
'question, answer, submitDate, stackCount 중 값이 1개 없습니다.'
);
const card = new CardRecord(
question,
answer,
submitDate,
stackCount,
userId
);
response.status = 201;
response.body = await mongoAPI.postCards(card);
} catch (error) {
response.status = 400;
response.body = {
success: false,
msg: `${error}`,
};
}
}
async function getCards({ response, state }: Context) {
try {
const userId = state.userId ?? '';
response.status = 200;
response.body = await mongoAPI.getCards(userId);
} catch (error) {
response.status = 400;
response.body = {
success: false,
msg: `${error}`,
};
}
}
export { getCards, addCard };
저런 코드에 대해서 테스트 코드를 작성할 수 있게 되었습니다.
import { Application, Router, assertEquals, superoak } from '../deps.ts';
import { addCard, deleteCard, getCards, updateCard } from './cards.ts';
const router = new Router();
router
.get('/api/card', (ctx) => {
ctx.state = { userId: 'user123' };
return getCards(ctx);
})
.post('/api/card', (ctx) => {
ctx.state = { userId: 'user123' };
return addCard(ctx);
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
Deno.test('it should create new card', async () => {
const request = await superoak(app);
await request
.post('/api/card')
.send({
question: 'CPU의 본딧말',
answer: 'Central Processing Unit',
submitDate: 'Wed May 17 2023 21:11:26 GMT+0900 (한국 표준시)',
stackCount: '0',
})
.expect(201);
});
Deno.test('it should read new card', async () => {
const request = await superoak(app);
await request.get('/api/card').expect(200);
});
테스트 코드를 이렇게 작성할 수 있게 되었습니다. 하지만 리소스 생성할 때 id를 지정하거나 응답을 접근 할 수 없어서 다른 테스트 케이스를 추가할 수 없었습니다.
이런 미제 사건을 굳이 참지 말고 포팅하는 것이 더 적절해 보입니다.