Reactjs 为什么我的jest mock函数没有';在使用enzyme'时,不能使用mock对象执行;s";山;功能?

Reactjs 为什么我的jest mock函数没有';在使用enzyme'时,不能使用mock对象执行;s";山;功能?,reactjs,enzyme,Reactjs,Enzyme,以下问题: 我有这个部分: const TodoHeader = ({ handleChange, handleSubmit }) => { return ( <form onSubmit={e => handleSubmit(e)}> <input type="text" onChange={e => handleChange(e.target.value)} placeholder="

以下问题:

我有这个部分:

const TodoHeader = ({ handleChange, handleSubmit }) => {
  return (
    <form onSubmit={e => handleSubmit(e)}>
      <input
        type="text"
        onChange={e => handleChange(e.target.value)}
        placeholder="your todo.."
      />
    </form>
  );
};
const TodoHeader=({handleChange,handleSubmit})=>{
返回(
handleSubmit(e)}>
handleChange(e.target.value)}
占位符=“您的待办事项…”
/>
);
};
通过以下测试:

it("should call the passed in handleSubmit function with the event object", () => {
    const handleSubmit = jest.fn();
    const wrapper = mount(<TodoHeader handleSubmit={handleSubmit} />);
    const form = wrapper.find("form");
    console.log(form.debug());
    const mockEvent = { target: {} };

    form.simulate("submit", mockEvent);

    expect(handleSubmit).toHaveBeenCalledWith(mockEvent);
    // Why does this work with shallow but not with mount?
  });
it(“应该用事件对象调用传入的handleSubmit函数”,()=>{
const handleSubmit=jest.fn();
const wrapper=mount();
const form=wrapper.find(“form”);
log(form.debug());
const mockEvent={target:{};
模拟(“提交”,模拟事件);
期望(handleSubmit).已与(mockEvent)一起调用;
//为什么这适用于浅层而不适用于mount?
});
这将失败,因为函数已使用实际的onSubmit事件调用。尽管我在用我的自定义对象模拟它

当我用
shallow
而不是
mount执行相同操作时,它将通过

我不明白为什么

这里有一个小的代码沙盒,可以对其进行测试


您不必测试onSubmit是否与您传递的事件对象一起工作-这将测试React本身和浏览器,这与您无关

我已经更新了你提供的codesandbox链接,根据这个测试,所有测试用例现在都通过了


所有您需要测试的是当您通过一个模拟函数时,该函数在表单提交后被触发

您不必测试onSubmit是否与您传递的事件对象一起工作-这将测试React本身和浏览器,这与您无关

我已经更新了你提供的codesandbox链接,根据这个测试,所有测试用例现在都通过了


所有您需要测试的是当您通过一个模拟函数时,该函数在表单提交后被触发

simulate
无论如何都不是推荐的方法。如果测试submit事件,则直接触发
props.onSubmit()
,就像
wrapper.props.handleSubmit()
,然后我可以检查它是否被正确调用?为什么不推荐使用simulate?它更像formWrapper.props.onSubmit()。simulate很快就会被弃用,因为它太多了。它并不真正模拟DOM,只是在内部调用相应的处理程序。啊,好吧,我明白了。我现在明白了。我必须先参考表格。多谢各位<代码>模拟
不是一种推荐的方法。如果测试submit事件,则直接触发
props.onSubmit()
,就像
wrapper.props.handleSubmit()
,然后我可以检查它是否被正确调用?为什么不推荐使用simulate?它更像formWrapper.props.onSubmit()。simulate很快就会被弃用,因为它太多了。它并不真正模拟DOM,只是在内部调用相应的处理程序。啊,好吧,我明白了。我现在明白了。我必须先参考表格。非常感谢你!非常感谢,我不知道。我想我必须测试它,因为我在从props接收的函数中手动传递它。但现在我这么看你是对的:)谢谢。我的测试总体上看起来怎么样?我刚刚开始学习测试,这就是我到目前为止的想法。它们被认为是单元测试,对吗?@GeraltDieSocke很高兴我能帮上忙。是的,这些被称为单元测试,我在这个问题中看到的那个看起来很好:)谢谢,谢谢!很高兴它不糟糕:)我能再问你一件事吗?我的第一个测试,如何使用快照来测试它?我知道它会保存应用程序的状态,并在下次进行比较。但是我如何得到它应该匹配的初始正确“快照”?非常感谢,我没有意识到这一点。我想我必须测试它,因为我在从props接收的函数中手动传递它。但现在我这么看你是对的:)谢谢。我的测试总体上看起来怎么样?我刚刚开始学习测试,这就是我到目前为止的想法。它们被认为是单元测试,对吗?@GeraltDieSocke很高兴我能帮上忙。是的,这些被称为单元测试,我在这个问题中看到的那个看起来很好:)谢谢,谢谢!很高兴它不糟糕:)我能再问你一件事吗?我的第一个测试,如何使用快照来测试它?我知道它会保存应用程序的状态,并在下次进行比较。但是,如何获得它应该匹配的初始正确“快照”?