Webpackモジュールのプライベート関数をユニットテストしたい

レガシーなJavaScriptソースをWebpackでビルドできるようにモジュールに切り分けてテストを書くことをしている(わりとヒマなので)。

jsモジュール内の機能をプライベート関数に分割して書く場合に、そのプライベート関数部分の単体テストを書きたい場合があると思うんだけど、それをどうやればいいのかわからなくていろいろ調べた。

unit testing - How to access and test an internal (non-exports) function in a node.js module? - Stack Overflow

こういう話で、ここではrewireを使えという事になってるんだけど、これはうまくいかなかった。rewire-webpackというのもあるんだけど、これもだめだった。

でうまくいったのは、exports-loaderでプライベート関数を指定してエクスポートする方法で、

1
2
3
4
5
6
7
8
9
10
11
function privateFunc() {
return "private";
}
function exportFunc() {
return "export";
}
module.exports = exportFunc;

こういうモジュールのテストを

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
describe('test', function() {
it('モジュールのテスト', function() {
var exportFunc = require('export-module.js');
expects(exportFunc()).toBe('export');
});
it('プライベート関数のテスト', function() {
var privateFunc = require("exports?privateFunc!./export-module.js");
expects(privateFunc).toBe('private');
});
});

こんな感じにしたらうまくいった。