テストするES6モジュールは次のようになります。
function privateFunction() {
...
}
export function publicFunction() {
... does something ...
privateFunction()
... does something else ...
}
ユニットテストにJESTを使用しており、publicFunctionをテストし、それをモックすることでprivateFunctionの実行を回避する方法を見つけようとしていますが、モックの試みに成功しませんでした。何か案が?
babel-plugin-rewireモジュールを使用して、プライベート関数をモックする方法を見つけました。
package.jsonには以下があります:
"devDependencies": {
...
"babel-plugin-rewire": "1.0.0-beta-5",
"babel-jest": "18.0.0",
...
。babel.rcには以下があります:
{
"presets": [
"es2015",
"stage-0",
"react"
],
"env": {
"test": {
"plugins": [
"babel-plugin-rewire"
]
}
},
...
この時点で、プライベート関数をモックすることができました。
import * as moduleToTest from './moduleToTest.js'
describe('#publicFunction', () => {
it('mocks private function', () => {
moduleToTest.__Rewire__('privateFunction', () => { console.log('I am the mocked private function') })
...
})
})
JavaScriptの性質を通り抜ける方法はありません。この関数はモジュールのスコープにバインドされているため、この関数が外部から存在することを知る方法がないため、関数にアクセスする方法も、最終的にはモックする方法もありません。
もっと重要かもしれませんが、テスト対象のオブジェクトの内部ではなく、パブリックAPIでのみテストする必要があります。それが重要なすべてです。パブリックAPIが安定している限り、内部でどのように処理されるかは誰も気にしません。