Использование библиотеки activ-hooks-testing-library с jest.spyOn - шпион не вызывается - PullRequest
1 голос
/ 05 июня 2019

У меня проблема с настройкой модульного теста, чтобы определить, что функция вызывается с правильными аргументами.useAHook возвращает функцию foo, которая вызывает функцию bar.Код выглядит следующим образом:

//myModule.js
export const useAHook = (arg1, arg2) => {
  const foo = useCallback(() => {
    bar(arg1, arg2);
  }, [arg1, arg2]);

  return foo;
}

export const bar = (a, b) => {
   //does some stuff with a and b
}

Я пытаюсь выполнить модульное тестирование этого кода, используя renderHook и jest.spyOn.Я хочу подтвердить, что вызов функции foo приводит к вызову bar с правильными аргументами.Мой модульный тест выглядит следующим образом:

//myModule.spec.js

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

it('should call foo with correct arguments', () => {
  const spy = jest.spyOn(myModule, 'bar');
  const { result } = renderHook(() => myModule.useAHook('blah', 1234));
  const useAHookFunc = result.current;

  useAHookFunc();

  // fails, spy is not called
  expect(spy).toBeCalledWith('blah', 1234);
});

В результате тест завершается неудачно, говоря, что spy никогда не вызывается.Я здесь что-то делаю неправильно или неправильно использую какой-либо инструмент?

1 Ответ

2 голосов
/ 06 июня 2019

Эта строка:

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

... импортирует привязки модуля для myModule.js в myModule.

Тогда эта строка:

const spy = jest.spyOn(myModule, 'bar');

... упаковывает модуль экспорта для bar в шпион ...

... но шпион не вызывается, потому что useAHook не вызывает экспорт модуля *1018* для bar, он просто вызывает bar напрямую.


Если вы измените useAHook для вызова экспорта модуля для bar, тогда будет вызван шпион.

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

Вы можете переместить bar в свой собственный модуль ...

... или вы можете импортировать привязки модуля для myModule.js, чтобы вы могли вызвать экспорт модуля для bar:

import { useCallback } from 'react';

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

export const useAHook = (arg1, arg2) => {
  const foo = useCallback(() => {
    myModule.bar(arg1, arg2);  // <= call the module export for bar
  }, [arg1, arg2]);

  return foo;
}

export const bar = (a, b) => {
   //does some stuff with a and b
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...