mochaを使ったJavaScriptのユニットテストのサンプル

消費税計算のユニットテスト

消費税計算用クラスとユニットテストのサンプルです。 クラス定義については以下を参照。

消費税計算用クラス

以下のような消費税計算用クラスのサンプルを、Tax.jsとして保存します。

(function() {
    function Tax() {
    }

    var p = Tax.prototype;

    p.calcFraction = function(value, fraction) {
        if (fraction == 1) {
            return Math.floor(value);
        } else if (fraction == 2) {
            return Math.ceil(value);
        } else if (fraction == 3) {
            return Math.round(value);
        } else {
            throw new Error('Invalid fraction value: ' + fraction);
        }
    } 

    /**
     * 消費税込み価格を求める
     */
    p.calcPriceWithTax = function(price, rate, fraction) {
        var value = (price * (100 + rate)) / 100; 
        return this.calcFraction(value, fraction);
    }

    if (typeof exports === 'object') {
        module.exports = Tax;
    } else {
        this.Tax = tax;
    }
})();

消費税計算用クラスのユニットテスト

以下のようなmochaを使ったTax.jsのユニットテストをTaxTest.jsとして保存します。

var assert = require('assert');
var Tax = require('./Tax.js');

describe('Tax module', function() {
    describe('calcPriceWithTax', function() {
        it('税込価格計算 端数切り捨て', function() {
            var fraction = 1;
            var tax = new Tax();
            assert.strictEqual(tax.calcPriceWithTax(1000, 8, fraction), 1080);
            assert.strictEqual(tax.calcPriceWithTax(1625, 8, fraction), 1755);
            assert.strictEqual(tax.calcPriceWithTax(1800, 8, fraction), 1944);
        });
        it('税込価格計算 端数切り上げ', function() {
            var fraction = 2;
            var tax = new Tax();
            assert.strictEqual(tax.calcPriceWithTax(1000, 8, fraction), 1080);
            assert.strictEqual(tax.calcPriceWithTax(1625, 8, fraction), 1755);
            assert.strictEqual(tax.calcPriceWithTax(1800, 8, fraction), 1944);
        });
        it('税込価格計算 端数四捨五入', function() {
            var fraction = 3;
            var tax = new Tax();
            assert.strictEqual(tax.calcPriceWithTax(1000, 8, fraction), 1080);
            assert.strictEqual(tax.calcPriceWithTax(1625, 8, fraction), 1755);
            assert.strictEqual(tax.calcPriceWithTax(1800, 8, fraction), 1944);
        });
    });
});

ユニットテストの実行

作成したTaxクラスのユニットテストTaxTest.jsを実行すると以下のようになります。

$ ./node_modules/.bin/mocha TaxTest.js

> @ test /home/vagrant/work/js/mocha
> mocha --recursive "TaxTest.js"



  Tax module
    calcPriceWithTax
      ✓ 税込価格計算 端数切り捨て
      ✓ 税込価格計算 端数切り上げ
      ✓ 税込価格計算 端数四捨五入


  3 passing (9ms)

mochaのインストール時に、オプション --no-bin-links を付けている場合は、以下を実行します。

./node_modules/mocha/bin/mocha TaxTest.js