NodeJs

TDD[5] TDD로 API 서버 개발

코딩클로스 2021. 3. 31. 17:10

첫 API 테스트 만들기

성공

유저 객체를 담은 배열로 응답한다

최대 limit 갯수만큼 응답한다.

 

실패

limit이 숫자형이 아니면 400을 응답한다.

offset이 숫자형이 아니면 400을 응답한다.

 

 

일단 서버를 실행하는 함수를 bin/www로 빼자

www.js 코드 

const app = require('../express.js')

app.listen(3000, () => {console.log(`running`)})

 

 

그리고 express.js 에서 앱모듈을 공개하자

module.exports = app -> express.js 에 추가

package.json 파일에서 스크립트 부분도 당연히 바꿔줘야함   

예시 코드)

index.spec.js 코드

//테스트파일은 파일명에 spec이란 단어를 넣거나 폴더를 만든다

const assert = require('assert') //node 기본 모듈
const should = require('should')
const request = require('supertest')
const app = require('./express') //express 파일에서 가져옴

describe('GET /users', () => {
    describe('성공', () => {
        it('성공', done => {
            request(app)
            .get('/users')
            .end((err, res) => {
                res.body.should.be.instanceof(Array)
                res.body.forEach(user => {
                    user.should.have.property('name')
                })
            })
            done()
        })
        it('최대 limit 갯수만큼 응답한다.', done => {
            request(app)
            .get('/users?limit=2')
            .end((err, res) => {
                res.body.should.have.lengthOf(2)
            })
            done()
        })
    })
    describe('실패', ()=> {
        it('limit이 정수가 아니면 400을 응답한다', done => {
            request(app)
                .get('/users?limit==two')
                .expect(400)
                .end(done)
        })
    })
})



 

express.js 코드

const express = require('express')
const logger = require('morgan')
const app = express()
const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bek' },
  { id: 3, name: 'Chris' }
]

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.get('/users', (req, res) => {
  req.query.limit = req.query.limit || 10; //limit에 값이 없다면 0을넣자
  const limit = parseInt(req.query.limit, 10);

  if (Number.isNaN(limit)) { //숫자인지 아닌지 확인 문자열이 들어오면 숫자로 변환이 안되니깐
    res.status(400).end();
  }
  else {
    res.json(users.slice(0, limit));
  }
})

module.exports = app