我有一个父组件,其中一段状态是用useImer定义的,如下所示:
const [example, setExample] = useImmer({
submitterId: {
value: EMPTY_STRING,
label: 'Submitter ID',
disabled: false,
status: null,
schema: submitterIdSchema
},
submitterName: {
value: EMPTY_STRING,
label: 'Submitter Name',
disabled: false,
status: null,
schema: submitterNameSchema
}});
字符串
这些状态被作为props传递给子组件,我正在尝试为子组件编写jest测试。这是一个简化的示例。
export function ChildComponent({
example,
setExample,
}) {
const handleInputChange = async (e, fieldName) => {
const valueToUpdateWith = e.target.value;
const schema = example[fieldName].yupSchema;
const status = await validate(valueToUpdateWith, schema);
setExample((draft) => {
draft[fieldName].status = status;
draft[fieldName].value = valueToUpdateWith;
});
};
return (
<div id="exampleContainer">
<ConnectedFieldGenerator // this just loops through keys in example and generates label/input field groups for them
fieldKeys={Object.keys(example)}
handleInputChange={handleInputChange}
/>
</div>
);
}
型
我写了下面的测试,以涵盖CNOSTInputChange函数,但在我的覆盖率报告中,setExample内部的逻辑没有涵盖。
const props = {
example: EXAMPLE_INITIAL_FIELD_STATE,
setExample: jest.fn(),
};
describe('Search Table Renders', () => {
it('input change of example', async () => {
const { container } = render(<ChildComponent{...props} />);
await enterInputValue(container, '#submitterId-input', 'Submitter ID');
expect(props.setBasicSearchState).toHaveBeenCalled();
});
});
型
我如何在我的测试中覆盖下面的行?
setExample((draft) => {
draft[fieldName].status = status; // NOT COVERED
draft[fieldName].value = valueToUpdateWith; // NOT COVERED
});
型
1条答案
按热度按时间ogq8wdun1#
您不需要模拟
setExample
函数,创建一个父组件用于测试目的。尽可能简单,为单个测试用例保留足够的逻辑。然后,将useImmer
钩子返回的真实的setExample
函数传递给<ChildComponent/>
组件。最后,Assert组件呈现的最新状态。例如
Child.jsx
:字符串
Child.test.jsx
:型
测试结果:
型