fooSpy
fooSpy
не вызывается, потому что foo
вызывается при создании enhance
, что происходит сразу после импорта index.jsx
, поэтому foo
ужебыл вызван к тому моменту, когда он был завернут в шпиона для создания fooSpy
.
Если вы хотите отловить, что был вызван foo
, вам нужно будет отложить создание enhance
.
barSpy
bar()
определяется локально в lib.js
и вызывается непосредственно в определении foo
.
jest.spyOn
заменяет модуль экспорта из bar
.Поскольку определение foo
использует bar
напрямую, а не экспорт модуля bar
, замена экспорта модуля bar
шпионом не влияет на вызов в foo
и barSpy
никогда не вызывается.
Если вы хотите отловить, что был вызван bar
, вам нужно будет использовать модуль экспорта из bar
в определении foo
.
Вот рабочая версия теста:
lib.js
import { lifecycle } from 'recompose';
import * as self from './lib'; // import the module into itself
export const foo = () =>
lifecycle({
componentDidMount() {
self.bar(); // call the module export for bar()
}
});
export const bar = () => {};
export const baz = () => {};
index.jsx
import * as React from 'react';
import { compose, lifecycle } from 'recompose';
import { foo, baz } from './lib';
export class MyComp extends React.Component {
render() { return (<div>My Comp</div>); }
}
// use a function to delay the creation of enhance()
export const initialize = () => {
const enhance = compose(
foo(),
lifecycle({
componentDidMount() {
baz();
}
})
);
return enhance(MyComp);
}
index.test.jsx
import * as React from 'react';
import { mount } from 'enzyme';
import * as lib from './lib';
import { initialize } from './index';
test('MyComp', () => {
const fooSpy = jest.spyOn(lib, 'foo');
const barSpy = jest.spyOn(lib, 'bar');
const bazSpy = jest.spyOn(lib, 'baz');
const MyComp = initialize(); // this will create enhance() which will call foo()
const didMountSpy = jest.spyOn(MyComp.prototype, 'componentDidMount');
const wrapper = mount(<MyComp />);
expect(didMountSpy).toHaveBeenCalledTimes(1); // PASS
expect(bazSpy).toHaveBeenCalledTimes(1); // PASS
expect(fooSpy).toHaveBeenCalledTimes(1); // PASS
expect(barSpy).toHaveBeenCalledTimes(1); // PASS
});