10862


下記のコードの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の依存性を解決する方法を教えていただけますか？


CC BY-SA 3.0
2015-06-01T09:06:06.457
10839
2015-06-03T12:11:55.937
4041
question
javascript node.js
node.jsのmoduleをmockする方法


[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に置き換えています。


CC BY-SA 3.0
2015-06-02T00:39:49.720
10862
2015-06-02T00:39:49.720
4809
10839
answer


スタブをローカルモジュールとして用意する方法は使えませんか？

`../stab_modules/great-util` など適当なディレクトリで、`npm init` して、package.json は
`"private" : true` に、great-util のスタブモジュールを作成。

使う側で、

[code]

    npm install ../stab_modules/great-util
    
[/code]

切り替えるには、`npm install great-util` が必要ですが  
great-util を使用する側は、スタブが作成できてれば、いつも通り使えるはず。


CC BY-SA 3.0
2015-06-03T12:11:55.937
10951
2015-06-03T12:11:55.937
4419
10839
answer