node.jsのprivateな関数のテストにrewireがすごく便利
node.jsでmodule.exportに書かない部分は外からアクセス出来ないプライベートな関数になる。 困っちゃうのがこれをテストしようとするとき。
結局テストのときだけ外に出したりutil作ったりといろいろ不恰好になって困っていたけど(rewire)rewireというモジュールがとても便利
例えばこんなモジュール
function initParams(input, options, callback){ if(typeof options === "function"){ callback = options; options = {}; } if(!options) options = {}; return { input : input, options : options, callback : callback } } module.exports = function(input, options, callback){ var params = initParams(input, options, callback) }
上記の場合、initParamsがprivateな関数になる。 ここでrewireさん登場。
var assert = require("assert") var rewire = require('rewire'); // ↓rewireでモジュールを呼び出す var myModule = rewire("../some_package.js"); // ↓__get__でprivateな関数を呼び出す var initParams = myModule.__get__("initParams") //あとは普通にassert var callback = function(){ }; var result = initParams("hoge", {"foo" :"bar"}, callback) var expect = { input : "hoge", options : {"foo" :"bar"}, callback : callback } assert.deepEqual(result, expect)
こんな感じで__get__
という関数でprivateな関数を呼び出せる。
__set__
というのもあって
myModule.__set__("fooValue", "1111"); myModule.__set__("barFunc", function(err, result){ assert.equal(expect, result) });
なんてこともできる
便利!