Не работает, потому что эта строка:
const func_spy = jest.spyOn(Test, 'func');
... создает шпион для экспорта модуля для func
...
... но Test.do
не вызывает экспорт модуля для func
, он вызывает func
напрямую.
Есть два варианта исправить это.
Нужно переместить func
в свой собственный модуль.
Затем модуль экспорта для него будет импортирован в index.js
и вызван в Test.do
...
... и когда экспорт модуля для func
обернут в шпиона, шпион будет вызван Test.do
.
Другой вариант - отметить, что «Модули ES6 поддерживают циклические зависимости автоматически» , поэтому модуль можно импортировать в себя.
Если модуль импортируется в себя, то Test.do
может вызвать экспорт модуля для func
:
import { Component } from 'react';
import * as index from './index'; // <= import the module into itself
export default class Test extends Component {
method() {
console.log('method()');
}
do() {
this.method();
index.func(); // <= use the module
}
render() {
return null;
}
}
export function func() {
console.log('func()');
}
... и шпион при экспорте модуля для func
будет вызван, как и ожидалось:
import { shallow } from 'enzyme';
import React from 'react';
import * as Test from './index';
describe('<Test>', () => {
const component = shallow(<Test.default />),
method_spy = jest.spyOn(component.instance(), 'method'),
func_spy = jest.spyOn(Test, 'func');
test('func()', () => {
component.instance().do();
expect(method_spy).toHaveBeenCalledTimes(1); // Success!
expect(func_spy).toHaveBeenCalledTimes(1); // Success!
});
});