web-dev-qa-db-ja.com

Jestでプライベート関数をモックする方法はありますか?

テストするES6モジュールは次のようになります。

function privateFunction() {
   ...
}
export function publicFunction() {
   ... does something ...
   privateFunction()
   ... does something else ...
}

ユニットテストにJESTを使用しており、publicFunctionをテストし、それをモックすることでprivateFunctionの実行を回避する方法を見つけようとしていますが、モックの試みに成功しませんでした。何か案が?

19
matteo

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') })
    ...
  })
})
17
matteo

JavaScriptの性質を通り抜ける方法はありません。この関数はモジュールのスコープにバインドされているため、この関数が外部から存在することを知る方法がないため、関数にアクセスする方法も、最終的にはモックする方法もありません。

もっと重要かもしれませんが、テスト対象のオブジェクトの内部ではなく、パブリックAPIでのみテストする必要があります。それが重要なすべてです。パブリックAPIが安定している限り、内部でどのように処理されるかは誰も気にしません。

7