首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@testing-library/react测试表onSubmit

@testing-library/react测试表onSubmit
EN

Stack Overflow用户
提问于 2020-05-08 05:39:03
回答 2查看 5.2K关注 0票数 0

在这样一个简单的场景中

代码语言:javascript
复制
function onSubmit() { e.preventDefault(); /* Some Submit Logic */ }

<form data-testid="form" onSubmit={(e) => onSubmit(e)}>
   <button type="submit" data-testid="submit-button">Submit</button>
</form>

如何确保表单在单击submit按钮时提交?

代码语言:javascript
复制
const { queryByTestId } = render(<LoginForm/>);
const LoginForm = queryByTestId("form")
const SubmitButton = queryByTestId("submit-button")
fireEvent.click(SubmitButton)

???

如何测试onSubmit()是否已被调用,或者表单是否已提交?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-09 03:51:43

基本上,这是我“解决”它的方法:

代码语言:javascript
复制
// LoginForm.js

export function LoginForm({ handleSubmit }) {

     const [name, setName] = useState('');

     function handleChange(e) {
         setName(e.target.value)
     }

     return (
         <form data-testid="form" onSubmit={() => handleSubmit({ name })}>
              <input required data-testid="input" type="text" value={name} onChange={(e) => handleChange(e)}/>
              <button type="submit" data-testid="submit-button">Submit</button>
         </form>
     )
}

export default function LoginPage() {

    function handleSubmit(e) {
        // submit stuff
    }

    return <LoginForm handleSubmit={(e) => handleSubmit(e)}/>

}

现在测试文件:

代码语言:javascript
复制
// LoginForm.test.js

import React from 'react';
import { render, fireEvent } from "@testing-library/react";
import LoginPage, { LoginForm } from "./LoginPage";

it("Form can be submited & input field is modifiable", () => {

    const mockSubmit = jest.fn();
    const { debug, queryByTestId } = render(<LoginForm handleSubmit={mockSubmit}/>);

    fireEvent.change(queryByTestId("input"), { target: { value: 'Joe Doe' } }); // invoke handleChange
    fireEvent.submit(queryByTestId("form"));

    expect(mockSubmit).toHaveBeenCalled(); // Test if handleSubmit has been called 
    expect(mockSubmit.mock.calls).toEqual([[{name: 'Joe Doe'}]]); // Test if handleChange works

});
票数 2
EN

Stack Overflow用户

发布于 2021-06-11 16:23:21

我建议使用nock来拦截从表单发送的请求,然后返回模拟的响应。例如:

代码语言:javascript
复制
nock('https://foo.bar').post('/sign-up', formValues).reply(201);

但是我想知道一个更好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61668195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档