使用 jest mount 在子组件中传递道具
Passing props in a child component using jest mount
我正在尝试构建一个小应用程序来测试我的笑话和酶知识。但是,我 运行 遇到了问题。
我有以下 Homepage.js:
const Homepage = props => {
const [input, setInput] = React.useState({
type: 'input',
config: {
required: true,
placeholder: 'Type a GitHub username'
},
value: ''
});
const onChangeInput = event => {
setInput(prevState => {
return {
...prevState,
value: event.target.value
};
});
};
return (
<section className={styles.Homepage}>
<form className={styles.SearchBox} onSubmit={(event) => props.getUser(event, input.value)} data-test="component-searchBox">
<h4>Find a GitHub user</h4>
<Input {...input} action={onChangeInput}/>
{props.error ? <p>{`Error: ${props.error}`}</p> : null}
<Button>Submit</Button>
</form>
</section>
);
};
我想测试输入字段在我输入时是否触发一个函数。 Input.js 组件如下:
const input = props => {
switch (props.type) {
case 'input':
return <input className={styles.Input} {...props.config} value={props.value} onChange={props.action} data-test="component-input"/>
default: return null;
};
};
你可以在下面找到我的测试:
const mountSetup = () => {
const mockGetUser = jest.fn()
return mount(
<Homepage type='input' getUser={mockGetUser}>
<Input type='input'/>
</Homepage>
);
};
test('State updates with input box upon change', () => {
const mockSetInput = jest.fn();
React.useState = jest.fn(() => ["", mockSetInput]);
const wrapper = mountSetup();
const inputBox = findByTestAttr(wrapper, 'component-input');
inputBox.simulate("change");
expect(mockSetInput).toHaveBeenCalled();
});
这里的问题是,在 Input.js 中,开关总是返回 null,即使我传递的是 props type='input'。因此,我得到错误方法“模拟”意味着在 1 个节点上 运行。找到 0 个。
有人可以帮我解决这个问题吗?
谢谢
您无需在主页中传递输入。主页有 input child 并且呈现
<Homepage type='input' getUser={mockGetUser}>
</Homepage>
您可以尝试在 React Usestate 模拟中传递数据。
React.useState = jest.fn(() => [{
type: 'input'
}, mockSetInput]);
我正在尝试构建一个小应用程序来测试我的笑话和酶知识。但是,我 运行 遇到了问题。
我有以下 Homepage.js:
const Homepage = props => {
const [input, setInput] = React.useState({
type: 'input',
config: {
required: true,
placeholder: 'Type a GitHub username'
},
value: ''
});
const onChangeInput = event => {
setInput(prevState => {
return {
...prevState,
value: event.target.value
};
});
};
return (
<section className={styles.Homepage}>
<form className={styles.SearchBox} onSubmit={(event) => props.getUser(event, input.value)} data-test="component-searchBox">
<h4>Find a GitHub user</h4>
<Input {...input} action={onChangeInput}/>
{props.error ? <p>{`Error: ${props.error}`}</p> : null}
<Button>Submit</Button>
</form>
</section>
);
};
我想测试输入字段在我输入时是否触发一个函数。 Input.js 组件如下:
const input = props => {
switch (props.type) {
case 'input':
return <input className={styles.Input} {...props.config} value={props.value} onChange={props.action} data-test="component-input"/>
default: return null;
};
};
你可以在下面找到我的测试:
const mountSetup = () => {
const mockGetUser = jest.fn()
return mount(
<Homepage type='input' getUser={mockGetUser}>
<Input type='input'/>
</Homepage>
);
};
test('State updates with input box upon change', () => {
const mockSetInput = jest.fn();
React.useState = jest.fn(() => ["", mockSetInput]);
const wrapper = mountSetup();
const inputBox = findByTestAttr(wrapper, 'component-input');
inputBox.simulate("change");
expect(mockSetInput).toHaveBeenCalled();
});
这里的问题是,在 Input.js 中,开关总是返回 null,即使我传递的是 props type='input'。因此,我得到错误方法“模拟”意味着在 1 个节点上 运行。找到 0 个。
有人可以帮我解决这个问题吗?
谢谢
您无需在主页中传递输入。主页有 input child 并且呈现
<Homepage type='input' getUser={mockGetUser}>
</Homepage>
您可以尝试在 React Usestate 模拟中传递数据。
React.useState = jest.fn(() => [{
type: 'input'
}, mockSetInput]);