Ответ 1
Есть метод spyOn
, который был представлен с v19 несколько дней назад, который делает именно то, что вы ищете
Я перебираюсь, чтобы шутить от мокко, и мне интересно, есть ли способ подсмотреть метод реагирования. Например, скажем, у меня есть следующий метод в моем компоненте (Игнорируйте библиотеку sdk, он просто конструирует вызов jQuery ajax):
getData() {
sdk.getJSON('/someURL').done(data => {
this.setState({data});
});
}
Используя синус, я бы проверил это, шпионируя по прототипу, например:
it('should call getData', () => {
sinon.spy(Component.prototype, 'getData');
mount(<Component />);
expect(Component.prototype.getData.calledOnce).to.be.true;
});
это обеспечило бы покрытие кода без издевательства над этим методом. Есть ли подобная функциональность в шутке?
EDIT: Кроме того, если эта функция не существует, какова следующая лучшая стратегия тестирования вызовов API?
Есть метод spyOn
, который был представлен с v19 несколько дней назад, который делает именно то, что вы ищете
На самом деле вы можете использовать jest.spyOn jest.spyOn
Если метод вызывается при создании компонента, используйте:
import { mount } from 'enzyme';
describe('My component', () => {
it('should call getData', () => {
const spy = jest.spyOn(Component.prototype, 'getData');
mount(<Component />);
expect(Component.prototype.getData).toHaveBeenCalledTimes(1)
});
})
или если у вас есть это в вашем DOM и методе bind, вы можете использовать:
import { shallow } from 'enzyme';
describe('My component', () => {
it('should call getData', () => {
const wrapper = shallow(<Component />);
const instance = wrapper.instance()
const spy = jest.spyOn(instance, 'getData');
wrapper.find('button').simulate('click')
expect(spy).toHaveBeenCalledTimes(1)
});
})
Вы можете перейти к новому методу spyOn
, а следующее должно работать нормально.
it('should call getData', () => {
Component.prototype.getData = jest.fn(Component.prototype.getData);
expect(Component.prototype.getData).toBeCalled();
});
Я использую Jest с React 16.8 - это сработало для меня:
it("lifecycle method should have been called", () => {
jest.spyOn(RedirectingOverlay.prototype, 'componentWillUnmount');
jest.spyOn(RedirectingOverlay.prototype, 'componentDidMount');
const wrapper = mount(<RedirectingOverlay message="Hi There!"/>);
expect(RedirectingOverlay.prototype.componentDidMount).toHaveBeenCalledTimes(1)
wrapper.unmount()
expect(RedirectingOverlay.prototype.componentWillUnmount).toHaveBeenCalledTimes(1)
})
Также используя:
"enzyme": "^3.6.0"
"jest": "23.5.0"
"enzyme-adapter-react-16": "^1.5.0"