如何在 React 组件的子组件中模拟 e.preventDefault
How to mock e.preventDefault in react component's child
嗨,我不知道如何在 React 组件的子组件中模拟内联函数
我的堆栈:sinon
、chai
、enzyme
;
组件使用:
<ListItem onClick={() => someFn()} />
组件的渲染:
render() {
return (
<li>
<a href="#" onClick={e => {
e.preventDefault();
this.props.onClick();
}}
> whatever </a>
</li>
);
}
这里我们有 onClick
调用 e.preventDefault()
的函数。如何告诉 <a href>
(link
) 不要调用 e.preventDefault()
?我如何模拟 onClick
?
以下是我在测试中尝试过的:
浅拷贝设置
function setup() {
const someFn = sinon.stub();
const component = shallow(
<ListItem
onClick={() => {
someFn();
}}
/>
);
return {
component: component,
actions: someFn,
link: component.find('a'),
listItem: component.find('li'),
}
}
和测试
it('simulates click events', () => {
const { link, actions } = setup();
link.simulate('click'); //Click on <a href>
expect(actions).to.have.property('callCount', 1); //will be fine if we remove e.preventDefault()
});
测试输出错误:
TypeError: Cannot read property 'preventDefault' of undefined
试试这个
link.simulate('click', {
preventDefault: () => {
}
});
test('simulates click events', () => {
const e = { stopPropagation: jest.fn() };
const component = shallow(<ListItem{...props} />);
const li = component.find('li').at(0).childAt(0)
li.props().onClick(e)
expect();
});
请注意,只有在使用 shallow
酶渲染器时才会出现此问题。在完整 DOM 渲染器 mount
的情况下,事件对象包含 preventDefault
方法,因此您不必模拟它。
我建议基于 jest.fn() 和
创建新对象
const event = Object.assign(jest.fn(), {preventDefault: () => {}})
然后使用它:
element.simulate('click', event);
对于那些使用 Jest 和 @testing-library
或 react-testing-library
s fireEvent
的用户,您需要提供一个初始化的事件对象,否则事件无法通过您的元素发送。
然后可以通过将 属性 分配给该初始化事件来断言 e.preventDefault
被调用:
test('prevents default on click', () => {
const {getByText} = render(<MyComponent />);
const button = getByText(/click me/);
// initialise an event, and assign your own preventDefault
const clickEvent = new MouseEvent('click');
Object.assign(clickEvent, {preventDefault: jest.fn()});
fireEvent(button, clickEvent);
expect(clickEvent.preventDefault).toHaveBeenCalledTimes(1);
});
与 stopPropagation
类似。
对于 Jest 很有用。
您可以通过一些测试工具定义具有您将模拟的功能的对象,例如查看Jest和酵素
describe('Form component', () => {
test('deos not reload page after submition', () => {
const wrapper = shallow(<TodosForm />)
// an object with some function
const event = { preventDefault: () => {} }
// mocks for this function
jest.spyOn(event, 'preventDefault')
wrapper.find('form').simulate('submit', event)
// how would you know that function is called
expect(event.preventDefault).toBeCalled()
})
})
我正在使用 Web 组件,这对我有用 -
const callback = jest.fn();
MouseEvent.prototype.stopPropagation = callback;
const element = createElement({});
element.shadowRoot.querySelector('ul').click();
expect(callback).toHaveBeenCalledTimes(1);
嗨,我不知道如何在 React 组件的子组件中模拟内联函数
我的堆栈:sinon
、chai
、enzyme
;
组件使用:
<ListItem onClick={() => someFn()} />
组件的渲染:
render() {
return (
<li>
<a href="#" onClick={e => {
e.preventDefault();
this.props.onClick();
}}
> whatever </a>
</li>
);
}
这里我们有 onClick
调用 e.preventDefault()
的函数。如何告诉 <a href>
(link
) 不要调用 e.preventDefault()
?我如何模拟 onClick
?
以下是我在测试中尝试过的:
浅拷贝设置
function setup() {
const someFn = sinon.stub();
const component = shallow(
<ListItem
onClick={() => {
someFn();
}}
/>
);
return {
component: component,
actions: someFn,
link: component.find('a'),
listItem: component.find('li'),
}
}
和测试
it('simulates click events', () => {
const { link, actions } = setup();
link.simulate('click'); //Click on <a href>
expect(actions).to.have.property('callCount', 1); //will be fine if we remove e.preventDefault()
});
测试输出错误:
TypeError: Cannot read property 'preventDefault' of undefined
试试这个
link.simulate('click', {
preventDefault: () => {
}
});
test('simulates click events', () => {
const e = { stopPropagation: jest.fn() };
const component = shallow(<ListItem{...props} />);
const li = component.find('li').at(0).childAt(0)
li.props().onClick(e)
expect();
});
请注意,只有在使用 shallow
酶渲染器时才会出现此问题。在完整 DOM 渲染器 mount
的情况下,事件对象包含 preventDefault
方法,因此您不必模拟它。
我建议基于 jest.fn() 和
创建新对象const event = Object.assign(jest.fn(), {preventDefault: () => {}})
然后使用它:
element.simulate('click', event);
对于那些使用 Jest 和 @testing-library
或 react-testing-library
s fireEvent
的用户,您需要提供一个初始化的事件对象,否则事件无法通过您的元素发送。
然后可以通过将 属性 分配给该初始化事件来断言 e.preventDefault
被调用:
test('prevents default on click', () => {
const {getByText} = render(<MyComponent />);
const button = getByText(/click me/);
// initialise an event, and assign your own preventDefault
const clickEvent = new MouseEvent('click');
Object.assign(clickEvent, {preventDefault: jest.fn()});
fireEvent(button, clickEvent);
expect(clickEvent.preventDefault).toHaveBeenCalledTimes(1);
});
与 stopPropagation
类似。
您可以通过一些测试工具定义具有您将模拟的功能的对象,例如查看Jest和酵素
describe('Form component', () => {
test('deos not reload page after submition', () => {
const wrapper = shallow(<TodosForm />)
// an object with some function
const event = { preventDefault: () => {} }
// mocks for this function
jest.spyOn(event, 'preventDefault')
wrapper.find('form').simulate('submit', event)
// how would you know that function is called
expect(event.preventDefault).toBeCalled()
})
})
我正在使用 Web 组件,这对我有用 -
const callback = jest.fn();
MouseEvent.prototype.stopPropagation = callback;
const element = createElement({});
element.shadowRoot.querySelector('ul').click();
expect(callback).toHaveBeenCalledTimes(1);