web-dev-qa-db-fra.com

Existe-t-il un moyen de se moquer des fonctions privées avec Jest?

Le module ES6 que je veux tester ressemble à ceci:

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

J'utilise JEST pour mes tests unitaires et j'essaie de trouver un moyen de tester publicFunction et d'éviter l'exécution de privateFunction en se moquant de lui, mais je n'ai pas réussi dans la tentative de simulation. Une idée?

19
matteo

J'ai découvert un moyen de se moquer de ma fonction privée en utilisant le module babel-plugin-rewire.

Dans package.json j'ai les éléments suivants:

  "devDependencies": {
    ...
    "babel-plugin-rewire": "1.0.0-beta-5",
    "babel-jest": "18.0.0",
    ...

Dans . Babel.rc j'ai ce qui suit:

{
  "presets": [
    "es2015",
    "stage-0",
    "react"
  ],
  "env": {
    "test": {
      "plugins": [
        "babel-plugin-rewire"
      ]
    }
  },
  ...

À ce stade, j'ai pu me moquer de la fonction privée:

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

Il n'y a aucun moyen de traverser la nature de JavaScript. La fonction est liée à la portée du module, il n'y a donc aucun moyen de savoir que cette fonction existe de l'extérieur, donc aucun moyen d'accéder à la fonction et, en fin de compte, aucun moyen de la moquer.

Peut-être plus important, vous ne devriez pas tester sur les internes de l'objet testé mais uniquement sur l'API publique. Parce que c'est tout ce qui compte. Personne ne se soucie de la façon dont les choses sont faites en interne tant que l'API publique reste stable.

7
Andreas Köberle