【问题标题】:Testing a function inside a component with jest and testing-library使用 jest 和 testing-library 测试组件内的函数
【发布时间】:2021-09-10 19:29:17
【问题描述】:

我是 testing-library 和 jest 的新手,我正在尝试测试组件内部的一个函数,该函数会更改输入的值。该组件是一个表单,另一个组件是它的输入。

export const Form = () => {
    const [name, setName] = useState("");
    const handleOnSubmit = e => {
        e.preventDefault();
        const form = e.target;
    };
    const inputChange = (param) => (e) => {
        const inputValue = e.target.value;
        setName(inputValue);
    };
    return (
        <form className="form" onSubmit={handleOnSubmit}>
            <InputGroup text="name" type="text" value={name} functionality={inputChange("name")}/>
            <Button type="submit"  disabled={name === undefined}/>
        </form>
    );
};

export default Form;

InputGroup 组件如下所示

export const InputGroup = ({type, id, value, required, functionality, text}) => {
    return (
        <label>{text}</label>
        <input className="input" type={type} id={id} name={id} value={value}
            required={required} onChange={functionality}
        />
    );
};

我已经尝试过类似的方法,但我不太确定如何测试直接在组件 Form 上的函数以及它正在传递给组件 InputGroup。

describe("Form", () => {
    let value;
    let component;
    const handleSubmit = jest.fn();
    const handleChange = ev => {
        ev.preventDefault();
        value = ev.currentTarget.value;
    }
    beforeEach(() => {
        component = render(
            <Form onSubmit={handleSubmit} functionality={handleChange} />
        );
    });
    it("check error name is triggered", () => {
        const input = component.getByText("name");
        fireEvent.change(input, {target: {value: "aaa"}});
    });
});

我收到一条错误消息,上面写着“给定元素没有值设置器”,那么如何将 inputChange 函数传递给 InputGroup 组件?

【问题讨论】:

  • 我不明白你有没有在FormInputGroup 中定义的道具functionality?如果是这样,请同时发布代码。
  • 我刚刚添加了输入组件@windmaomao。谢谢你的回答!

标签: reactjs testing jestjs testing-library


【解决方案1】:

好的,感谢分享InputGroup。这样您就可以轻松测试InputGroup

describe("InputGroup", () => {
  it("check error name is triggered", () => {
    const fn = jest.fn()
    render(<InputGroup functionality={functionality} />)
    fireEvent.change(input, {target: {value: "aaa"}});
    expect(fn).toHaveBeenLastCalledWith(...)
  });
});

只是一个想法。上面的代码可能不会像发布的那样运行。好的,现在来到Form。该步骤可能类似,但可能需要一些时间来解决,但您无需再次测试功能,因为此道具与Form 无关。从表单的角度来看,它只关心onSubmit,因此您可以使用之前发布的类似方式对其进行测试。

【讨论】:

  • 那如何在Form组件上测试输入不为空呢?默认情况下,除非输入有值,否则我的按钮被禁用,我也想测试它。谢谢你,@windmaomao!
  • 您可以通过onSubmit 在表单中间接测试它,或者如果表单支持通用onChange,您也可以针对它进行测试。基本上你应该专注于测试直接的第一级接口属性或方法,而不是所有的逻辑。否则你将结束一个巨大的集成测试。通常这不是目的。
  • 不会调用 onSubmit,因为只要输入的值为空,按钮就会被禁用。通用的 onChange 是什么意思?我已经使用“handleChange”方法传递了 onChange,但它不起作用
  • 没错。您无法轻松测试集成行为。可以有一个按钮提交表单,然后通过测试点击按钮触发提交。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2020-03-22
  • 2020-05-14
  • 2021-11-27
  • 2021-02-11
  • 1970-01-01
  • 2020-01-20
  • 2020-09-03
相关资源
最近更新 更多