预期呼叫次数:>= 1 接收呼叫次数:0

IT技术 javascript reactjs unit-testing jestjs enzyme
2021-05-09 05:51:29

我正在学习带有钩子的 reactjs 表单,现在我想使用 jest 和酶测试提交表单。

这是我的登录组件。

import React from 'react'

function Login() {
    const [email, setEmail] = useState('');
    const [password, setPassword] = useState('');

    const handleSubmit = async (e) => {
        e.preventDefault();
        // ....api calLS
    }
    return (
        <div>
             <form onSubmit={handleSubmit} className="login">
    
            <input type="email" id="email-input" name="email" value={email} onChange={e => setEmail(e.target.value)} />
        
            <input type="password" id="password-input" name="password" value={password} onChange={e =>setPassword(e.target.value)} />
            
            <input type="submit" value="Submit" />
             </form> 
        </div>
    )
}

export default Login

这是 login.test.js 文件

it('should submit when data filled', () => {
    const onSubmit = jest.fn();
    const wrapper = shallow(<Login />)
    const updatedEmailInput = simulateChangeOnInput(wrapper, 'input#email-input', 'test@gmail.com')
    const updatedPasswordInput = simulateChangeOnInput(wrapper, 'input#password-input', 'cats'); 
    wrapper.find('form').simulate('submit', {
      preventDefault: () =>{}
    })

    expect(onSubmit).toBeCalled()
 })

不幸的是,当我运行时npm test出现以下错误 在此处输入图片说明

我需要做什么来解决此错误或测试表单教程?

2个回答

这里的问题是您创建了一个模拟,但您正在测试的组件并未使用它。

const onSubmit = jest.fn(); // this is not being used by <Login />

对此的解决方案是使用注释模拟您在代码中描述的 api 调用,// ....api calLS并验证这些调用是否成功。

import { submitForm } from './ajax.js'; // the function to mock--called by handleSubmit
jest.mock('./ajax.js'); // jest mocks everything in that file

it('should submit when data filled', () => {
    submitForm.mockResolvedValue({ loggedIn: true });
    const wrapper = shallow(<Login />)
    const updatedEmailInput = simulateChangeOnInput(wrapper, 'input#email-input', 'test@gmail.com')
    const updatedPasswordInput = simulateChangeOnInput(wrapper, 'input#password-input', 'cats'); 
    wrapper.find('form').simulate('submit', {
      preventDefault: () =>{}
    })

    expect(submitForm).toBeCalled()
 })

有用的链接

免责声明:我对 Enzyme 框架没有经验。

因为您的模拟函数 onSubmit 未绑定到您的表单。你不能这样测试。如果你要调用一些 api onSubmit,你可以模拟这个 api 并检查它是否被调用 (mockedApiFunction)。