読者です 読者をやめる 読者になる 読者になる

ぶれすとつーる

だいたいjavascript

Nodeのテストを簡単にするCuckooモジュール

untestableなコードを簡単にテスト可能にするモジュール Cuckoo を作りました。

f:id:nazomikan:20130512050518j:plain

以前書いたNodeでプライベートな(exportsされてない)メソッドのテストをパス周りとかmodule周りとかきちんと細かいところまで作ったものです。

npmにインストールされてるのでこんな感じではいります。

npm install cuckoo 

たとえばこんな感じのファイルがあったとして

target.js

var util = require('util')
  ;

function untestableMethod() {
  util.isArray([1, 2, 3]);
}

exports.testableMethod = function () {
  return 1;
}

testableMethodの返り値テストとuntestableMethodのutil#isArrayの引数チェックとかのテストがしたいとします。

testableMethodはexportsされてるので問題ないんですのですがuntestableMethodはexportsされてないいわゆるprivateなメソッドなのでテストに難儀するわけですがcuckooを使えばこの辺が超楽にかけます。

var cuckoo = require('cuckoo')
  , assert = require('assert')
  ;

describe('#untestableMethod', function () {
  it('should have set the array to util#isArray', function () {
    var target
      , mock = {}
      ;

    mock.util = {
      isArray: function (ary) {
        assert.deepEqual([1, 2, 3], ary); // pass
      }
    };

    target = cuckoo.load('./target.js', mock);
    target.private.untestableMethod();
  });
});

describe('#testableMethod', function () {
  it('should get 1', function () {
    var target = cuckoo.load('./target.js')
      ;

    assert.equal(1, target.public.testableMethod());
  });
});

こんな感じ。

以前公開してた記事のコードではパス周りがloaderコードからの相対パスになってたりしたのですがmodule.parent.filenameとか駆使してこの辺をうまくテストコードからの相対パスになるようにしたりグローバル変数の追加だったりmodule周りのメソッドの拡充だったり色々しておきました。

テストで難儀してるかたは試してみると幸せになれるかしれません。

名前の由来はカッコーで、カッコーの特性の托卵(別の鳥の卵に自分の卵をまぎれさせて子育てさせる)がアクティベーションオブジェクトの差し替えやrequireのモックオブジェクト差し替えとかに似てるなーって感じでつけてます。

apiとかの細かい使用に関してはgithubのほうを参照ください。