【问题标题】:My jest unit test case is failing for Material UI multi select我的笑话单元测试用例因 Material UI 多选而失败
【发布时间】:2021-04-07 17:55:11
【问题描述】:

我正在尝试为材质 UI 多选编写单元测试用例。

父组件代码是-

import {myData} from '../constant';
export const Parent = () => {    
 const onChangeStatus= (selectedValues: Array<string>) => {
        setTest({
                   ...test,
                   values: selectedValues
                });
    }      
  return (
            <Child
                onChange={onChangeStatus}
                myData={test}
            />
    );      
}

子组件代码是 -

import React from 'react'
export interface ChildProps {
    onChangeStatus: (values: Array<string>) => void;
    myData?: Array<Test<string, string>> | null;
}

export const Child = ({onChangeStatus , myData}: ChildProps) => {  
  return (
        <div>
            <MultiSelect
                multiple
                native
                value={myData.val}
                onChange={(event: React.ChangeEvent<HTMLSelectElement>): void => {
                        const { selectedOptions } = event.target;
                        let values: string[] = Array.from(selectedOptions).map(selectedOption => selectedOption.value);
                        onChangeStatus(values);
                         }}>
                            {myData &&
                                myData.multiSelectData &&
                                myData.multiSelectData.map(
                                    (item: Test<string, string>) => (
                                        <option key={item.key} value={item.value}>
                                            {item.key.replace('_',' ')}
                                        </option>
                                    )
                                )}
                        </MultiSelect>
        </div>
    );
    
}

这是我写的测试用例-

it('should call onChange handler when test multi select is selected', () => {
        const event = {target: { value: 'All', key: 'All' }};
        wrapper
            .find(MultiSelect)
            .first()
            .props()
            .onChange('test', event);
        expect(mockOnChange).toHaveBeenCalled();
    });

这个测试用例失败了。出现错误,例如 - TypeError: Cannot read property 'selectedOptions' of undefined。此功能的代码也不包括在内。 谁能帮助我通过测试用例并获得 100% 的多选代码覆盖率。

【问题讨论】:

    标签: reactjs typescript jestjs material-ui enzyme


    【解决方案1】:

    你应该使用onChange(event),而不是test 字符串,因为你的函数只接收一个prop,而不是两个。

    在测试中模拟的event 还有另一个问题。您需要定义 selectedOptions 属性,因为您在组件中使用它。像这样的:

    const event = {target: { selectedOptions: [{ value: 'All', key: 'All' }] } };

    另外,关于你的测试,你可以通过检查你的模拟函数被调用的参数来改进它。它将验证您是否将正确的值传递给它。像这样的:

    expect(mockOnChange).toHaveBeenCalledWith(['All']);
    

    【讨论】:

    • 我也是这样做的。现在我收到TypeError: Cannot convert undefined or null to object 错误。我认为错误在Array.from(selectedOptions).map(selectedOption =&gt; selectedOption.value); 行。
    • 哦,对不起,我错过了。这是因为您正在从目标访问selectedOptions,并且您没有在测试中的event 上定义它。我会改变我的回复
    • 现在说,expect(jest.fn()).toHaveBeenCalledWith(...expected); Expected: ["All"] Number of calls: 0 这一行出错 - expect(mockOnChange).toHaveBeenCalledWith(['All']);
    • 你能添加你的测试代码吗?我不知道你是如何声明模拟函数和wrapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2017-12-16
    • 2019-07-06
    • 2019-02-15
    • 2019-10-08
    相关资源
    最近更新 更多