Как проверить функции в функции с помощью Jest - PullRequest
0 голосов
/ 25 марта 2020

У меня есть некоторый код, который имеет функции внутри функций, и я хочу иметь возможность модульного тестирования функций внутри родительской функции.

Мне нужны тесты, которые тестируют их и шпионят за ними (необходимы оба требования).

Пример:

export default parentFunction = () => {

  const innerFunction = () => {
    //that does stuff
  }

  const anotherInnerFunction = () => {
    //that does more stuff
  }

  //and at some point, the functions are called

  //like this
  innerFunction()

  const anotherFunction = () => {
    //or like this
    anotherInnerFunction()  
  }
}

Я не смог найти способ проверить эти внутренние функции. Я пробовал следующее.

Пример теста

import parentFunction from "myfile"

it("should call innerFunction", () => {
  //this causes an error in jest
  const innerFunctionSpy = jest.spyOn(parentFunction, "innerFunction")
  //..etc
  expect(innerFunctionSpy).toHaveBeenCalled()
})

it("will return a value from anotherInnerFunction", () => {
  //this does not work
  const value = parentFunction.anotherInnerFunction()
  //this also does not work
  const value = parentFunction().anotherInnerFunction()
  //..etc
})

Требуется ли рефакторинг родительской функции, чтобы можно было тестировать эти внутренние функции? Если моя родительская функция была объектом, то я мог бы проверить их, однако я не уверен, смогу ли я изменить свой код, чтобы он работал следующим образом.

Например

export default parentFunction = {
  innerFunction: () => {
    //that does stuff
  },
  //more code
}

1 Ответ

1 голос
/ 25 марта 2020

Вы не можете получить доступ к переменным или функциям scoped внутри другой функции в JavaScript. Если вы явно не открываете их, возвращая их из этой функции или экспортируя их из модуля. Речь идет не о Jest, а о том, как это работает в JavaScript.

jest.spyOn(parentFunction, "innerFunction")

Приведенная выше строка кода указывает Jest, что функция innerFunction установлена ​​как свойство объекта parentFunction, но это не так. Фактически innerFunction - это функция в области внутри parentFunction, к которой нельзя получить доступ вне области действия parentFunction. Если вы не вернете это явно или не определите его в области действия уровня модуля, а затем экспортируете его.

Но внутренние детали или детали реализации таких внутренних функций не должны быть представлены, но если это необходимо, чтобы оно было помечено как таковое с использованием _ перед его именем, возьмите следующий пример:

 //scoped to the module
 const _innerFunction = () => {
    //that does stuff
 }

 //scoped to the module
 const _anotherInnerFunction = () => {
    //that does more stuff
 }

 //exported as a public API
 const anotherFunction = () => {
     _anotherInnerFunction()  
 }


const publicApi = {
  anotherFunction,
  // expose the private functions for unit tests
  _innerFunction,
  _anotherInnerFunction 
}

export default publicApi;

Затем в вашем тестовом примере Jest:

import publicApi from "myfile"

it("should call anotherFunction", () => {
  const anotherFunctionSpy = jest.spyOn(publicApi, "anotherFunction")
  //..etc
  expect(anotherFunctionSpy ).toHaveBeenCalled()
})

it("should call _innerFunction", () => {
  const innerFunctionSpy = jest.spyOn(publicApi, "_innerFunction")
  //..etc
  expect(innerFunctionSpy ).toHaveBeenCalled()
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...