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

Sim*_*ker 31 javascript reactjs jestjs

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

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

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

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

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

这是它的样子

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

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

klu*_*gjo 65

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

使用模拟返回值一次

myMock
  .mockReturnValueOnce(10)
  .mockReturnValueOnce('x')
  .mockReturnValue(true);
Run Code Online (Sandbox Code Playgroud)

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

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

使用toHaveBeenNthCalledWith

expect(mock).toHaveBeenNthCalledWith(1, '1st call args');
expect(mock).toHaveBeenNthCalledWith(2, '2nd call arg 1', '2nd call arg 2');
Run Code Online (Sandbox Code Playgroud)

会断言

  • 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!')
Run Code Online (Sandbox Code Playgroud)

  • 不知道 toHaveBeenNthCalledWith ,它看起来很实用,谢谢伙计! (4认同)
  • 如果 Jest 文档如此有用且简洁就好了。谢谢。 (3认同)