#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