TDD with Mocha + Chai(2)

kdo0129·2020년 6월 27일
0

TDD

목록 보기
2/2
post-thumbnail

Mocha

Mocha 공식 홈페이지 메인에 있는 Mocha에 대한 설명이다.

Mocha is a feature-rich JavaScript test framework running on Node.js and in the browser, making asynchronous testing simple and fun. Mocha tests run serially, allowing for flexible and accurate reporting, while mapping uncaught exceptions to the correct test cases.

How to use Mocha?

dependencies 설치

Mocha 설치

npm i -D mocha

import 구문을 사용하기 위해서는 @babel/core, @babel/preset-env, @babel/register 설치가 필요하다.

npm i -D @babel/core @babel/preset-env @babel/register

.babelrc

{
  "presets": ["@babel/preset-env"]
}

package.json

"scripts": {
  "test": "mocha --require @babel/register --recursive"
}

기본 스펙

describe("title", function() { ... })

구현하고자 하는 기능에 대한 설명이 들어간다. 우리 예시에선 함수 pow가 어떤 동작을 하는지에 대한 설명이 들어갈 것이다. it 블록을 한데 모아주는 역할도 한다.

it("유스 케이스 설명", function() { ... })

it의 첫 번째 인수엔 특정 유스 케이스에 대한 설명이 들어간다. 이 설명은 누구나 읽을 수 있고 이해할 수 있는 자연어로 적어준다. 두 번째 인수엔 유스 케이스 테스트 함수가 들어간다.

assert.equal(value1, value2)

기능을 제대로 구현했다면 it 블록 내의 코드 assert.equal(value1, value2)이 에러 없이 실행된다.

출처 - ko.javascript.info

테스트할 유닛 작성

index.js

export const findUserAge = () => {
  //실패 케이스를 위해 아무것도 없는 상태로 시작
};

실패 케이스

import { findUserAge } from '../index';

let assert = require('assert');

describe('findUserAge', function () {
  let users = [
    { userName: 'ehdna1234', age: 20, gender: 'male' },
    { userName: 'Lee1234', age: 28, gender: 'female' },
    { userName: 'Jane123', age: 30, gender: 'female' },
    { userName: 'Tom000', age: 15, gender: 'male' },
  ];
  it("should return 존재하지 않는 유저입니다. when the userName doesn't exist", function () {
    assert.equal(findUserAge(users, 'ehdna'), '존재하지 않는 유저입니다.');
  });
  it('should return 30 when the userName is Jane123', function () {
    assert.equal(findUserAge(users, 'Jane123'), 30);
  });
  it('should return 15 when the userName is Tom000', function () {
    assert.equal(findUserAge(users, 'Tom000'), 15);
  });
});

테스트 실행

npm run test

코드 수정하여 성공

index.js

export const findUserAge = (users, userName) => {
  let age = "존재하지 않는 유저입니다.";
  users.forEach(user => {
    if (user.userName === userName) {
      age = user.age;
    }
  });
  return age;
};

성공 케이스 작성

import { findUserAge } from '../index';

let assert = require('assert');

describe('findUserAge', function () {
  let users = [
    { userName: 'ehdna1234', age: 20, gender: 'male' },
    { userName: 'Lee1234', age: 28, gender: 'female' },
    { userName: 'Jane123', age: 30, gender: 'female' },
    { userName: 'Tom000', age: 15, gender: 'male' },
  ];
  it("should return 존재하지 않는 유저입니다. when the userName doesn't exist", function () {
    assert.equal(findUserAge(users, 'ehdna'), '존재하지 않는 유저입니다.');
  });
  it('should return 30 when the userName is Jane123', function () {
    assert.equal(findUserAge(users, 'Jane123'), 30);
  });
  it('should return 15 when the userName is Tom000', function () {
    assert.equal(findUserAge(users, 'Tom000'), 15);
  });
});

테스트 실행

npm run test

리팩토링 후 테스트 하고 다음 유닛 테스트 추가

index.js

export const findUserAge = (users, userName) => {
  return users.reduce((userAge, user) => {
    return user.userName === userName ? userAge = user.age : userAge;
  }, '존재하지 않는 유저입니다.');
};

테스트 실행

npm run test

Chai

Chai 공식 페이지에 있는 Chai에 대한 설명이다.

Chai is a BDD / TDD assertion library for node and the browser that can be delightfully paired with any javascript testing framework.

Chai는 다양한 assertion을 제공해주는 라이브러리이다.

Chai is an assertion library, similar to Node's built-in assert. It makes testing much easier by giving you lots of assertions you can run against your code.

How to use Chai?

Install dependency

npm i -D chai

test.js에서 적용

import chai from 'chai';
import { findUserAge } from '../index';

let assert = chai.assert;

describe('findUserAge', function () {
  let users = [
    { userName: 'ehdna1234', age: 20, gender: 'male' },
    { userName: 'Lee1234', age: 28, gender: 'female' },
    { userName: 'Jane123', age: 30, gender: 'female' },
    { userName: 'Tom000', age: 15, gender: 'male' },
  ];
  it("should return 존재하지 않는 유저입니다. when the userName doesn't exist", function () {
    assert.equal(findUserAge(users, 'ehdna'), '존재하지 않는 유저입니다.');
  });
  it('should return 30 when the userName is Jane123', function () {
    assert.equal(findUserAge(users, 'Jane123'), 30);
  });
  it('should return 15 when the userName is Tom000', function () {
    assert.equal(findUserAge(users, 'Tom000'), 15);
  });
});

테스트 실행

npm run test

참고하면 좋은 포스트

0개의 댓글