Jest 用不同的参数模拟同一个函数两次

IT技术 javascript reactjs jestjs
2021-04-19 03:32:35

我是 JEST 的新手,目前正在测试一个 Javascript 组件,该组件在其 onComponentDidMount 中进行 API 调用。根据 ajax 调用(api 调用)的返回数据,我的组件要么显示一个表格,要么显示一个简单的文本。

我的 JEST 测试相当简单,目前我只是测试以匹配当前的快照。因此,由于我的 api 调用可以返回不同的数据,因此我的快照可以有两个不同的方面:1) 一个带有表格 2) 一个带有简单的文本。

我成功地嘲笑了这样的服务

jest.mock("/myService", () => ({
  index: (data, callback) => {
    const return = [
      {
        {...}
      },
    ]
    callback(return)
  },
}))

我的组件myService.index()正确执行调用,我希望将不同的值传递给它,这些值将用于进行回调。

这是它的样子

it("has proper snapshot", () => {
    const props = {...}
    const component = shallow(<MyComponent {...props} />)
    expect(component).toMatchSnapshot()
  })

这对第一个例子很有用,但我似乎找不到适合我的正确答案。你能帮助我吗 ?:)

2个回答

1- 如果您希望模拟在每次调用时返回不同的结果:

使用模拟返回值一次

myMock
  .mockReturnValueOnce(10)
  .mockReturnValueOnce('x')
  .mockReturnValue(true);

10在第一次通话、'x'第二次通话以及true之后的任何时间返回。

2- 如果您想检查模拟已被调用的参数:

使用toHaveBeenNthCalledWith

expect(mock).toHaveBeenNthCalledWith(1, '1st call args');
expect(mock).toHaveBeenNthCalledWith(2, '2nd call arg 1', '2nd call arg 2');

会断言

  • mock被称为与'1st call args'第一次它被称为- >mock('1st call args')

  • mock被称为与'2nd call arg 1''2nd call arg 2'第二次它被称为- >mock('2nd call arg 1', '2nd call arg 2')

3- 如果您想要基于函数参数的特定响应

jest 默认不支持它,但您可以查看jest-when,它允许您执行以下操作:

when(fn).calledWith(1).mockReturnValue('yay!')
不知道 toHaveBeenNthCalledWith,它看起来很实用,谢谢伙计!
2021-06-09 03:32:35
如果只有 Jest 文档如此有用和简洁就好了。谢谢你。
2021-06-19 03:32:35

请查看有关此Jest 文档您可以在模拟函数时返回不同的值,并且一次返回您希望的值,然后返回不同的值。

好的,这已经有很大帮助了。但是将值传递给这个模拟呢?基本上我想{a: 1, b:2}在一种情况下传递给它{}在另一种情况下
2021-05-26 03:32:35