(수근수근)

TDD 로 하는 API 서버 개발 -(1) 본문

type & Javascript

TDD 로 하는 API 서버 개발 -(1)

InformationFarm 2021. 10. 14. 01:39
.해당 내용은 인프런의 '테스트주도개발(TDD)로 만드는 NodeJS API 서버'를 정리한 내용입니다.

사용자 목록 조회 API 테스트 코드 만들기

 

🔶 GET users 코드

 

[ API SPEC ]

  • 성공
    • 유저 객체를 담은 배열로 응답한다
    • 최대 limit 갯수만큼 응답한다
  • 실패
    • limit이 숫자가 아니면 400을 응답한다
    • offset이 숫자가 아니면 400을 응답한다
app.get('/users', function (req, res) {
  const limit = req.query.limit;
  res.json(users.slice(0,limit));
});

🔶 GET users TEST 성공

 

  • 유저 객체를 담은 배열로 응답한다
const app = require('./index');
const should =  require('should');
const request = require('supertest');

describe('GET /users는 ', () =>{
    describe('성공시', ()=>{
        it('유저 객체를 담은 배열로 응답한다',(done)=>{   
            request(app)
                .get('/users')
                .end((err, res)=>{
                    // 받은 배열 값을 검증한다
                    res.body.should.be.instanceOf(Array);
                    done();
                })
        })
    })
})
  • 최대 limit 갯수만큼 응답한다
it('최대 limit갯수만큼 응답한다', (done) => {
            request(app)
                .get('/users?limit=2')
                .end((err, res) => {
                    res.body.should.have.lengthOf(2);
                    done();
                })
        })

→ 결과

 


 

🔶 GET users 코드 (실패)

app.get('/users', function (req, res) {
  req.query.limit = req.query.limit || 10 ;
  const limit = parseInt(req.query.limit,10);
  if(Number.isNaN(limit)){
    //end()함수로 응답을 진행해준다. 
    return res.status(400).end();
  }
  res.json(users.slice(0,limit));
});

 

🔶 GET user TEST 실패

  • imit이 숫자가 아니면 400을 응답한다
  • offset이 숫자가 아니면 400을 응답한다
describe('실패시', ()=>{
            it('limit이 숫자가 아니면 400을 응답한다',(done)=>{
                request(app)
                    .get('/users?limit=two')
                    .expect(400) //400응답 값을 기대한다. 
                    .end(done);
            })
        })

→ 결과

 

 


사용자 조회 API 성공시 - GET /user/:id

 

  • 성공
    • id가 1인 유저 객체를 반환한다.
  • 실패
    • id가 숫자가 아닐 경우 400으로 응답한다.
    • id로 유저를 찾을 수 없는 경우 404로 응답한다.

 

🔶 GET users/:id 코드

app.get('/users/:id', function(req, res){
    const id = parseInt(req.params.id, 10) //10진법 
    const user =  users.filter((user)=> user.id === id)[0];
    res.json(user);
});

 

🔶 GET users/:id 테스트 코드

describe('GET users/1는 ', () =>{
    describe('성공시', () =>{
        it('id가 1인 유저 객체를 반환한다',(done) =>{
            request(app)
                .get('/users/1')
                .end((err, res) => {
                    //첫번째 파라미더 기대하는 ID , 
                    //두번째 파리미터 기대하는 값
                    res.body.should.have.property('id', 1);
                    done();
                })
        })
    })
  })

 

→ 결과


 

사용자 조회 API 실패시 - GET /user/:id

 

🔶 실패에 대한 처리를 한 GET users/:id 코드

app.get('/users/:id', function(req, res){
    const id = parseInt(req.params.id, 10) //10진법 
    if(Number.isNaN(id)) return res.status(400).end();

    const user =  users.filter((user)=> user.id === id)[0];
    if(!user) return res.status(404).end();    
    res.json(user);
});

 

🔶 실패에 대한 GET users/:id 테스트 코드

describe('실패시', ()=>{
    it('id가 숫자가 아닐경우 400으로 응답한다', (done)=>{
        request(app)
            .get('/users/one')
            .expect(400)
            .end(done)
    });
    it('id로 유저를 찾을 수 없을 경우 404로 응답한다',(done)=>{
        request(app)
            .get('/users/999')
            .expect(404)
            .end(done)
    });
})

 

→ 결과

 

 


NPM 테스트 스크립트

기존에는 D:\start-node-api\apiserver\node_modules\.bin>mocha ..\..\index.spec.js 이렇게 테스트 코드를 실행하였다. 이제는 script를 등록해서 편하게 실행해보자

 

Script추가

"scripts": {
    "test": "mocha index.spec.js"
  }

 

→ 결과

cmd 창에 D:\start-node-api\apiserver>npm test 을 입력한다.

mocha의 위치를 지정하지 않아도 자동으로 설정이 된다.

'type & Javascript' 카테고리의 다른 글

[JS]동기와 비동기  (0) 2021.11.17
TDD로 하는 API 서버 개발 -(2)  (0) 2021.10.16
[NodeJS]테스트 주도개발  (0) 2021.10.03
[NodeJS] REST API란  (0) 2021.10.03
[ NodeJS ] Express 기초  (0) 2021.10.03
Comments