Я ожидал, что когда я смоделировал модуль с помощью jest.mock()
и передал реализации функций каждому объекту, они перенесли бы в тесты.
import * as services from '_services';
// I thought this would be enough to mock 'load_basket'
jest.mock('_services', () => ({
load_basket: jest.fn(() => Promise.resolve([]))
}));
describe('WB Component', () => {
it('loads basket if basket prop is null', () => {
// However, if I don't use .mockImplemenation here it gives
// me an error that load_basket wasn't called
const spy = spyOn(services, 'load_basket').mockImplementation(() => Promise.resolve([]));
const wrapper = shallow(<WB basket={null} />);
expect(spy).toHaveBeenCalled();
wrapper.unmount();
spy.mockRestore();
});
});
Но я могу удалить реализацию функции в .mock
и имею только load_basket: jest.fn()
, но я не могу удалить .mockImplementation(() => Promise.resolve([]))
внизу, или я получу expected spy to have been called, but it was not called
.
Редактировать: Если у меня нет ни реализации функции в исходном .mock
call или .mockImplementation
, это даст мне TypeError: Cannot read property 'then' of undefined
... load_basket, являющийся 'неопределенным'.Это имеет смысл для меня, но я до сих пор не понимаю, почему насмешка над функцией в .mock
делает ее отличной от той, что была показана в тесте?
Edit2: load_basket
используется вследующим образом
class WB extends Component {
constructor(props) {
super(props);
this.state = {
basket: props.basket,
loading_basket: !props.basket,
};
}
componentDidMount(): void {
if (!this.state.basket) {
load_basket()
.then(res => {
this.setState({
basket: res,
loading_basket: false
});
})
.catch( ... );
}
}
render () { ... }
}