Node.js-TDD(테스트 주도 개발)

1 분 소요

TDD

  • .sepc.js 파일은 테스트코드를 의미한다.
  • 모카 (mocha)
    • 모카란? 테스트 코드를 돌려주는 테스트 러너 (노드가 돌려주는 것이 아님.)
    • 테스트 수트 : 테스트 환경으로 모카에서는 describe()으로 구현한다.
    • 테스트 케이스 : 실제 테스를 말하며 모카에서는 it()으로 구현한다.
    • assert는 쓰지말라고 node공식문서에 나와있다.
  • 단위 테스트 : 함수 하나하나의 기능 테스트 ()
  • 통합 테스트 : API의 기능 테스트
    • superTest는 express용 통합 테스트 라이브러리이다.
    • 내부적으로 익스프레스 서버를 구동시켜 실제 요청을 보낸뒤 결과를 검증한다
    • superTest 에서 .expect()상태코드예상할 때 쓴다.
  • mocha가 내부적으로 서버를 구동시켜주기때문에 기존에 app.js에서 app.listen으로 구동시켜주던 코드를 bin/www.js로 빼고 npm start는 nodemon bin/www로 돌리고 npm test할 때 request(app)은 더 이상 서버돌리는 코드가 없어지고 순수하게 mocha가 서버를 돌릴 수 있게 된다.

  • api를 만들 때 순서 - 테스트코드→비즈니스로직→라우터

  • 테스트 코드
import app from "../app"
import request from "supertest"
import should from "should"
import {describe, it} from "mocha";

describe('POST api/apply/:postId 요청은 ', ()=>{
    describe('성공 시', ()=>{
        let post = {
            title : "요거프레소",
            workingDate : "2019-09-30",
            workingTime : "14:00-17:00",
            pay : "70000",
            address : "경기도 파주시 영어마을대로 14길",
            dueDate : "2019-09-30",
            description : "추억의 카페",
            category : "RESTAURANT"
        };
        let body;
        before((done)=>{
            request(app)
                .post("/api/post/createPost")
                .send(post)
                .expect(201)
                .end((err, res)=>{
                    body = res.body;
                    done();
                });
        });
        it('id라는 속성을 가지고 있어야한다.', function () {
            body.should.have.property("id")
        });
        it('입력한 title을 반환해야한다.', function () {
            body.should.have.property("title", "요거프레소")
        });
    });
    describe('실패 시', ()=>{
        it('title 파라미터가 누락되었을 시 400을 응답해야한다.', (done)=> {
            request(app)
                .post("/api/post/createPost")
                .send({})
                .expect(400)
                .end(done)
        });
        it('title 파라미터가 중복일 경우 409을 응답해야한다.', (done)=> {
            request(app)
                .post("/api/post/createPost")
                .send({title:"요거프레소"})
                .expect(409)
                .end(done)
        });
    })
});

카테고리:

업데이트:

댓글남기기