ひ孫

犬のこととか書いていきたい

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)
});

なんてこともできる

便利!