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를 지정하거나 응답을 접근 할 수 없어서 다른 테스트 케이스를 추가할 수 없었습니다.

이런 미제 사건을 굳이 참지 말고 포팅하는 것이 더 적절해 보입니다.