モノラルログ

マツオ ( @matsuoshi / monaural.net ) のざっくりしたブログです

module.exports されていない関数を rewire でテストする

JavaScript + jest で古いコード、module.exports されていない関数をテストしたかったのですが、rewire というのを使えば可能でした、というメモ

たとえばこんなコード

function privateSum(a, b) {
  return a + b
}

とだけ書かれたファイルがあるとします。この後に

module.exports = privateSum

ってされていれば、テストコードから import すればいいだけなんですが、export されていないので外部から privateSum関数にはアクセスできません

rewire

ここで rewire というライブラリをかませます

github.com

rewire, かなり昔からあるライブラリっぽい。これを使って、こんな風にテストを書くことができます。

const rewire = require('rewire')
const myModule = rewire('../src/private')

test('exported function', () => {
  const sum = myModule.__get__('privateSum')
  expect(sum(1, 2)).toBe(3)
})

まず rewire を requireし、その rewire を使って対象のソースコードを読み込みます。

そんで

  const sum = myModule.__get__('privateSum')

この __get()__ というメソッドで、export されていない関数を参照できるようになるという具合。あとは普通に呼び出してテスト可能。

べんり。

モック化にも使える

__set()__ というメソッドもあり、対象の関数や変数を差し替えることも可能でした。なのでテスト時のモック化なんかにも使える。

べんり。


サンプルこちら

github.com