Издеваться не в шутку - PullRequest
1 голос
/ 08 мая 2019

Пожалуйста, помогите мне разобраться в шутках Джеста.

Я поместил несколько фиктивных функций в файл:

// actions.js
export function f1() {
  return 1
}

export function calls_f1() {
  f1()
}

А затем в своем тестовом файле я пытаюсь понять, какпроверьте, что функция вызывает другую функцию:

import * as actions from './actions.js'

describe("MOCKS", () => {
  actions.f1 = jest.fn();
  actions.calls_f1();
  expect(actions.f1).toBeCalled();
});

Но тест не проходит, сообщая, что фиктивная функция не была вызвана.Я также попытался поменять местами 2-ю и 3-ю строчки теста, но безрезультатно.

Мой jest config все в порядке, на самом деле я проводил кучу других испытаний (в этом же файле)работает.

Что мне здесь не хватает?


Примечание. Фактическая реализация этого (что я здесь значительно упрощаю) включает в себя файл actions, который включает в себя открытый export function fetchStations(), который вызывает приватный (или, скорее, не экспортируемый) export function _downloadStations().Я пытаюсь проверить, что _downloadStations() называется.

Я использую import * as actions только для удобства, поэтому я могу написать эту строку и затем использовать любые функции, которые файл экспортирует в actions.whatever() (вместо необходимости добавлять функции в оператор импорта, когда я решаюиспользуй их).Если import * as actions имеет какой-то эффект, который я не замечаю (как подразумевает Брайан ниже), то, конечно, мне не нужно его использовать, и, конечно, я могу использовать import {thisAction, thatAction} from './actions'.

1 Ответ

1 голос
/ 09 мая 2019

Эта строка:

import * as actions from './actions.js'

связывает экспорт модуля из actions.js в actions ...

... поэтому установка actions.f1 для фиктивной функции заменяет экспорт модуля для f1 ...

... но это не влияет на calls_f1, поскольку он вызывает f1 напрямую.


Если calls_f1 изменен для вызова модуля экспорта для f1, то он вызовет фиктивную функцию.


Есть два способа сделать это.

Один из способов - переместить f1 в собственный модуль.

Другой способ - отметить, что модули ES6 «автоматически поддерживают циклические зависимости» (основная цель разработки модулей ES6), поэтому модуль может импортировать свой собственный экспорт:

actions.js

import * as actions from './actions';  // <= import the module...

export function f1() {
  return 1
}

export function calls_f1() {
  actions.f1()  // <= ...and use it to call f1
}

actions.test.js

import * as actions from './actions.js'

describe('actions', () => {
  it('calls_f1 should call f1', () => {
    actions.f1 = jest.fn();
    actions.calls_f1();
    expect(actions.f1).toBeCalled();  // Success!
  })
})

Обновление

OP обновил вопрос, чтобы указать, что рассматриваемая функция не экспортируется из модуля.

В этом случае это просто внутренняя деталь реализации модуля, и за ней нельзя следить непосредственно.

Тестирование будет включать проверку на вызываемые ею эффекты, а не шпионить за ним напрямую, чтобы узнать, был ли он вызван.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...