[컴][nodejs] mocha, chai, sinon

test framework /mock up / bdd / tdd / node에서 tdd / test unittest / test case

mocha, chai, sinon

mocha with typescript

typescript 와 mocha 를 이용하는 방법은 아래 링크를 참고하자.

npm install mocha chai ts-node --save-dev
mocha --recursive -r ts-node/register ./src/ts/test/**/*.test.ts

cheatsheets

sinon

stub 는 type 들을 다 맞춰줘야 한다. 그래서 간단히 만들때는 fake 가 더 낫긴 하다. 하지만 확실히 정확한 test 를 위해서는 type 을 맞추는 stub 가 나을 수 있다.

ts-node + mocha 의 debugging 을 위한 vscode launch.js

trace는 진단로그(diagnostic log) 를 찍어준다.
sourceMaps 은 sourceMap 이 있는 js 인 경우 sourceMap 을 사용한다.
2개의 옵션이 없어도 ts 에 대한 debug 가 잡히는 것 같다.
 {  
    "version": "0.2.0",  
    "configurations": [  
        {  
            "args": [  
                "-u",  
                "bdd",  
                "--timeout",  
                "999999",  
                "--colors",  
                "-r",  
                "ts-node/register",  
                "--recursive",  
                "${file}"  
            ],  
            "internalConsoleOptions": "openOnSessionStart",  
            "name": "Mocha Tests Current File",  
            "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",  
            "request": "launch",  
            "skipFiles": [  
                "/**"  
            ],  
            "type": "pwa-node",  
            "trace": true,  
            "sourceMaps": true,  
       }  
    ]  
}

unittest examples

특정 object.method 안에서 "다른 object.method" 의 parameter 를 확인하기 위한 방법

export class MyRequest {
  host = 'bunjang.co.kr';
  version = 4;
  constructor() {

  }

  async retrieve() {
    const customAxios =
      this._getCustomAxios();
    // const now = new Date();
    const utcNow = moment().utc();
    // ex: 2020918080254
    const requestId = utcNow.format("YYYYMDDHHmss");
    const response = await customAxios.get(`/api/1/product/${startPid}/detail_info.json`, {
      params: {
        version: this.version,
        // get random 7 digit which starts with 1
        stat_uid: this._getStatUid()
      }
    })
  }

  _getCustomAxios() {
    const customAxios = axios.create({
      baseURL: `https://test/`
    })
    return customAxios;
  }
}
import sinon, { spy } from 'sinon';
import { expect } from 'chai';
import { AxiosResponse } from 'axios';

describe('Reuquest', () => {
    it('should retrieve', async () => {

        const spyGet = spy((url: string, param: any): AxiosResponse => {
            return {
                data: {
                    list: [],
                },
                status: 200,
                statusText: "",
                headers: {},
                config: {},
            };
        });

        const fakeGet = sinon.fake.returns({
            get: spyGet
        })

        const myReq = new MyRequest();

        sinon.replace(
            myReq,
            '_getCustomAxios',
            fakeGet);

        await myReq.retrieve();
        sinon.restore();

        // get 을 1번째 call 했을 때의 argument중 2번째(args[1])
        const actualParam = { ...spyGet.getCall(0).args[1].params };
        expect(actualParam).to.deep.equal({
            test1: 'mytest',
            version: 'mytest-ver',
        });
    });

}); 

댓글 없음:

댓글 쓰기