Jest onSpy - ожидаемая фиктивная функция была вызвана

Я борюсь с использованием spyOn как часть тестирования моего модуля utils.js. Я пробовал различные методы и подходы, но все, кажется, дают "ожидаемую вызывающую функцию, которая была вызвана". Для записи, другие модульные тесты работают хорошо, поэтому не должно быть никаких проблем с моей реальной настройкой теста.

Ниже приведен упрощенный тестовый пример с двумя функциями и одним тестом, и я даже не могу заставить их работать. Неужели я вообще не понял шпиона?

// utils.js
function capitalHelper(string){
  return string.toUpperCase();
}

function getCapitalName(inputString){
  return capitalHelper(inputString.charAt(0)) + inputString.slice(1);
}

exports.capitalHelper = capitalHelper
exports.getCapitalName = getCapitalName



// utils.test.js
const Utils = require('./utils');

test('helper function was called', () => {
  const capitalHelperSpy = jest.spyOn(Utils, 'capitalHelper');
  const newString = Utils.getCapitalName('john');
  expect(Utils.capitalHelper).toHaveBeenCalled();
})

1 ответ

Решение

Я не использую spyOn(), но вместо этого jest.fn() для всех ложных сценариев

В вашем случае я бы сделал следующее

test('helper function was called', () => {
    Utils.capitalHelper = jest.fn((s) => Utils.capitalHelper(s))
    const newString = Utils.getCapitalName('john')
    expect(Utils.capitalHelper.mock.calls.length).toBe(1)
})

Первая строка могла бы быть просто:

Utils.capitalHelper = jest.fn()

так как вы, кажется, не проверяете возвращенное значение в вашем тесте:)

Вы можете найти более подробную информацию о jest.fn() в официальной документации jest: https://facebook.github.io/jest/docs/en/mock-functions.html

----------------------- РЕДАКТИРОВАТЬ

Я понял: проблема возникает из-за того, что в вашем файле utils.js getCapitalName использует определенную функцию, а не ту, на которую указывает экспорт.

Чтобы иметь возможность имитировать используемую функцию, вы можете изменить файл utils.js на

// utils.js
const Utils = {
    capitalHelper: string => string.toUpperCase(),
    getCapitalName: inputString => Utils.capitalHelper(inputString.charAt(0)) + inputString.slice(1)
}

export default Utils

тогда тесты, которые я дал прежде, будут работать

Другие вопросы по тегам