【问题标题】:Jest mocking with react calling actual event handler after calling mock function在调用模拟函数后用反应调用实际事件处理程序来开玩笑模拟
【发布时间】:2018-07-19 09:08:00
【问题描述】:

我有这个组件测试

    const component = mount(<MemoryRouter><Login/></MemoryRouter>);
    const emailField = component.find('input[type="email"]');
    const passwordField = component.find('input[type="password"]');
    const mockedSubmitFunction=jest.fn();
    component.find(Login).instance().onSubmit=mockedSubmitFunction;
    emailField.simulate('change', { target: { value: testEmail } });
    passwordField.simulate('change', { target: { value: testPassword } });
    component.find('form').simulate('submit');
    expect(mockedSubmitFunction).toBeCalled();

在我拥有的组件中

在构造函数中:-

this.onSubmit = this.onSubmit.bind(this);

和事件处理程序

   onSubmit(event) {
   event.preventDefault(); 

当我在 onSubmit 中设置断点时,它在执行模拟的 onSubmit 后进入组件函数,为什么会发生这种情况。

我以为它只会调用模拟的 onSubmit。

我在做什么不同?

代码沙盒:https://codesandbox.io/s/q95lv7vlrw

但沙箱显示找不到路径中的模块:'object-inspect/util.inspect' 相对于 '/node_modules/object-inspect/index.js' 出于某种原因,我猜这是不相关的

【问题讨论】:

  • 在你拥有的组件中..什么都没有?你能提供你问题的codesandox重现吗?
  • @AndyTheos 它有一个渲染,但为了简单起见,我发出了它,它只显示两个字段用户名和密码字段,表单为

标签: reactjs unit-testing jestjs enzyme


【解决方案1】:

所以你得到了函数模拟,但实际的 onSubmit 被调用。相反,如果您只想调用模拟 fn,则必须提供它(例如,作为测试规范中的道具)。

const mockedSubmitFunction = jest.fn(event => {
  console.log("Mocked function");
});
const component = mount(
  <MemoryRouter>
    <Login login={mockedSubmitFunction} />
  </MemoryRouter>
);

updated sandbox为你。

您可以另外查看explained example on form testing

更新:我认为 OP 的实际问题是模拟函数正在触发,但它被复制到实例,因此 expect...toBeCalled() 失败(未调用实际的 mockedFn)。您可以通过将模拟函数作为道具传递、监视函数等来避免这些问题。

【讨论】:

  • 嗨@Andy我在我分享的实际链接中有一个小问题,当我注释掉 test 中的电子邮件和密码更改事件时,测试正在调用实际的事件处理程序,但是当我只有调用模拟函数。这是为什么 ? codesandbox.io/s/0xn814y05v 和我分享的实际链接已通过测试..
  • codesandbox.io/s/6n0wp17jyk 看看这个,我想你需要像这样传递它,但不是component.find(Login).instance().onSubmit = mockedSubmitFunction;
  • 我也更新了截图,现在你可以看到expect...toBeCalled和我expect..toEqual时的实际调用结果的区别。
  • 当我做 componen.find(Login).instance().forceUpdate();分配模拟后,测试通过了。 codesandbox.io/s/6zrxj9n9r
  • 它与输入更改和forceUpdate 一起工作的原因是更新自身。您可以使用更新(不喜欢这个)或使用我提到的方法。安装的酶更新 -airbnb.io/enzyme/docs/api/ReactWrapper/update.html,酶 v3 文档 -github.com/airbnb/enzyme/blob/master/docs/guides/…
猜你喜欢
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2023-03-17
  • 2018-05-05
  • 2021-05-22
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多