node.jsのmoduleをmockする方法


下記のコードのsomeUtilをテスト時にスタブにできないか試行錯誤しています。

[code]

    var someUtil = require('great-util');
    
    module.export = {
        "action": function() { someUtil.method(); }
    }
    
[/code]

苦肉の策で現状はmoduleの実装とinterfaceを分割して行っています。

[code]

    module.export = {
         "action": function() { Module.actiomImpl(someUtil) },
         "actionImpl": function(someUtil){ someUtil.method() }
    }
    
[/code]

moduleのsomeUtilをスタブにしたいと考えているのですが、上記のような実装のnode_moduleの依存性を解決する方法を教えていただけますか？




[proxyquire](https://www.npmjs.com/package/proxyquire)というモジュールを利用すると、便利です。

[code]

    var proxyquire = require('proxyquire');
    
    proxyquire("./path/to/use/site", {"great-util": {
        method: function() { /* this is mock */ }
    }});
    
[/code]

第1引数に渡した文字列のモジュールから読み込む依存モジュールの実装が、第2引数に渡したオブジェクトになります。  
第2引数は、キーがモジュール名、値が`module.exports`に与える実装オブジェクトです。

[私の利用例](https://github.com/mysticatea/uptodate/blob/master/test/lib/override-
opener.js)では、ブラウザを開くモジュールをSpyに置き換えています。




[proxyquire](https://www.npmjs.com/package/proxyquire)というモジュールを利用すると、便利です。

[code]

    var proxyquire = require('proxyquire');
    
    proxyquire("./path/to/use/site", {"great-util": {
        method: function() { /* this is mock */ }
    }});
    
[/code]

第1引数に渡した文字列のモジュールから読み込む依存モジュールの実装が、第2引数に渡したオブジェクトになります。  
第2引数は、キーがモジュール名、値が`module.exports`に与える実装オブジェクトです。

[私の利用例](https://github.com/mysticatea/uptodate/blob/master/test/lib/override-
opener.js)では、ブラウザを開くモジュールをSpyに置き換えています。

