【问题标题】:How to mock a function in jest or prevent default?如何开玩笑地模拟函数或防止默认值?
【发布时间】:2019-09-25 22:47:34
【问题描述】:

我正在尝试使用 react-testing-lib 进行一些集成测试

我想在我的 react 类中模拟一个名为 handleSubmit 的函数

handleSubmit(){
 // does some stuff
 // calls an action creator

}

我基本上想存根这个方法,以便它返回null/undefined 或任何东西。但我不希望它真正调用动作创建者

我想断言一些 UI 存在并且调用动作创建者的原因是给我错误:

动作必须是普通对象。使用自定义中间件进行异步操作。

我也尝试过jest.mock(thismethod) 和 jest.spyOn()`,但似乎都不起作用。我只是想让它做类似的事情

myFunc() {

}

好像它是一个空函数并且什么都不做。我该如何存根?

【问题讨论】:

  • 您能否发布您尝试模拟但无法与包含函数的类一起使用的代码?
  • 模拟商店准备好了吗?
  • @Shruti 并不是因为它是敏感代码。没有通用的方法吗?
  • @RedBaron 你能帮我确认一下我的理解吗:类具有调用动作的功能。您想测试功能(虽然是模拟)但不希望调用该动作(可能是模拟动作),对吗?
  • @Shruti 是的,这是正确的

标签: javascript reactjs unit-testing jestjs react-testing-library


【解决方案1】:

看起来handleSubmit 是一个原型方法...如果是,那么您可以像这样模拟它:

import * as React from 'react';
import { render, fireEvent } from 'react-testing-library';

class MyComponent extends React.Component {
  handleSubmit() {  // <= prototype method
    throw new Error('should not get here');
  }
  render() {
    return (<button onClick={this.handleSubmit}>the button</button>);
  }
}

test('MyComponent', () => {
  const mock = jest.spyOn(MyComponent.prototype, 'handleSubmit');
  mock.mockImplementation(() => {});  // <= replace the implementation

  const { getByText } = render(<MyComponent/>);
  fireEvent.click(getByText('the button'));

  expect(mock).toHaveBeenCalled();  // Success!
});

只需确保在渲染组件之前在原型上实现模拟即可。

【讨论】:

  • 这看起来很有帮助。虽然有一件事我不知道该怎么做。如何模拟实现以模拟 API 调用和响应?基本上我想模拟处理提交来调用我的一个名为notify 的操作,然后通知应该在屏幕上显示一些用户界面。目前我只是在做mock.mockImplementation(() =&gt; false,但这不会调用动作,因此不会呈现 UI。那有意义吗?有解决办法吗?
【解决方案2】:

试试下面的函数和动作模拟:

//Mock function
 var mockPromise = new Promise((resolve, reject) => {
    resolve(<mock response similar to actual promise response>);
});
functionName = jest.fn().mockReturnValueOnce(mockPromise)

//Mock action
const actions = [];
const dispatchAction = jest.fn((dispatchCall) => {
      actions.push(dispatchCall);
});

functionName()(dispatchAction);
expect(dispatchAction).toBeCalledTimes(1)

【讨论】:

  • 我看不出你在哪里嘲笑原始动作?
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 2019-11-17
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多