jest와 supertest 통합 테스트에 사용하기

·2021년 12월 1일
0

서버

목록 보기
3/5

[Node로 TDD하기]

[TDD 방식 관련]

[Node.js] TDD 방식이 왜 필요할까?

결론: TDD하더라도 하향식으로 만들어나가는 게 좋을 듯. 상향식은 시간이 너무 많이 걸리고, 특히 sequelize 이용하는 경우 까다로운 부분이 많음.

[SuperTest 이용하기]

공식 튜토리얼 참고하되, get 관련은 아래 링크 참고

supertest.Response.body JavaScript and Node.js code examples | Tabnine

객체 비교는 toStrictEqual 활용하기!

  • 예시: main.int.test.js
    const request = require("supertest");
    const { sequelize } = require("../../models");
    const app = require("../../app");
    
    beforeAll(async () => {
        await sequelize.sync({});
    });
    
    describe("/main", function () {
        it("GET /main/status", function (done) {
            request(app)
                .get("/main/status?UserId=1")
                .set("Accept", "application/json")
                .expect((res) => {
                    console.log(res.body);
                    **expect(res.body).toStrictEqual({
                        nickname: "테스트",
                        history: 9,
                        deposit: 1000000,
                        containStockAsset: 8000,
                    });**
                })
                .expect(200, done);
        });
    });

ISSUES

⭐ 결론: sequelize-mock으로 findall, findone등 하는 건 좋지 않은 선택임. sequelize-mock은 post를 위주로(create) 만들어진 라이브러리인 듯.

[Received function did not throw 문제]

:JEST Received function did not throw, but HTTPError is thrown

[supertest랑 같이 쓰면서 계속 db 못 찾는 문제]

: cannot connect to db · Issue #680 · visionmedia/supertest

: Environment Variables · Jest

jest는 자동으로 NODE_ENV를 test로 설정해 줌.

config/index.js

    ```jsx
    // dotenv 사용 시 config.json -> config.js로 사용.
    require("dotenv").config();
    const env = process.env;
    
    const development = {
        username: env.MYSQL_USERNAME,
        //env.MYSQL_USERNAME은 불러오고자 하는 데이터의 키값이므로 자유롭게 이름설정이 가능하다.
        password: env.MYSQL_PASSWORD,
        database: env.MYSQL_DATABASE,
        host: env.MYSQL_HOST,
        dialect: "mysql",
        port: env.MYSQL_PORT,
    };
    
    const production = {
        username: env.MYSQL_USERNAME,
        password: env.MYSQL_PASSWORD,
        database: env.MYSQL_DATABASE,
        host: env.MYSQL_HOST,
        dialect: "mysql",
        port: env.MYSQL_PORT,
    };
    
    const test = {
        username: env.TEST_USERNAME,
        password: env.TEST_PASSWORD,
        database: env.TEST_DATABASE,
        host: env.TEST_HOST,
        dialect: "mysql",
        port: env.TEST_PORT,
    };
    
    module.exports = { development, production, test };
    ```
    
- .env
    
    ```jsx
    MYSQL_HOST=localhost
    MYSQL_USERNAME=root
    MYSQL_PASSWORD=비밀번호
    MYSQL_DATABASE=damdadb
    MYSQL_PORT=3306
    
    RDS_HOST=localhost
    RDS_USERNAME=root
    RDS_PASSWORD=비밀번호
    RDS_DATABASE=damdadb
    RDS_PORT=3306
    
    TEST_HOST=localhost
    TEST_USERNAME=root
    TEST_PASSWORD=비밀번호
    TEST_DATABASE=damdadbtest
    TEST_PORT=3306
    ```
    

위와 같이 설정해주면 잘 됨.

profile
이것저것 개발하는 것 좋아하지만 서버 개발이 제일 좋더라구요..

0개의 댓글