проверка, была ли оконная функция вызвана внутри перехвата

#reactjs #testing #jestjs #react-hooks #react-testing-library

#reactjs #тестирование #jestjs #реагирующие перехваты #react-testing-library

Вопрос:

У меня есть функция, которую мне нужно смоделировать в перехватчике react: window.analytics.identify и проверить, была ли она вызвана

 function useNiceHook(data) {
  useEffect(() => {
    ...
      window.analytics.identify(
        ...
  }, [data])
}

export { useNiceHook }
  

Я пытаюсь издеваться над этим следующим образом

 windowSpy.mockImplementation(() => ({
        analytics: {
          identify: jest.fn(),
        },
}))
  

и затем протестируйте:

 renderHook(() => useNiceHook(data))
expect(window.analytics.identify).toBeCalled()
  

Но в настоящее время я получаю неудачный тест:

 Error: expect(jest.fn()).toBeCalled()

Expected number of calls: >= 1
Received number of calls:    0
  

Ответ №1:

Решение для модульного тестирования:

index.js :

 import { useEffect } from 'react';

function useNiceHook(data) {
  useEffect(() => {
    window.analytics.identify();
  }, [data]);
}

export { useNiceHook };
  

index.test.js :

 import { useNiceHook } from './';
import { renderHook } from '@testing-library/react-hooks';

describe('63401335', () => {
  it('should pass', () => {
    const mAnalytics = {
      identify: jest.fn(),
    };
    Object.defineProperty(window, 'analytics', {
      value: mAnalytics,
    });
    const data = {};
    renderHook(() => useNiceHook(data));
    expect(mAnalytics.identify).toBeCalled();
  });
});
  

результат модульного теста с отчетом о покрытии:

  PASS  src/stackoverflow/63401335/index.test.js
  63401335
    ✓ should pass (24ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.js |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.13s, estimated 13s
  

исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/63401335