【问题标题】:Jest mock the same function twice with different argumentsJest 用不同的参数模拟同一个函数两次
【发布时间】:2019-05-22 01:36:30
【问题描述】:

我是 JEST 的新手,我目前正在测试一个在其 onComponentDidMount 中进行 API 调用的 Javascript 组件。根据 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()
  })

这对于第一个示例非常有效,但我似乎找不到适合我的正确答案。你能帮助我吗 ? :)

【问题讨论】:

    标签: javascript reactjs jestjs


    【解决方案1】:

    请查看Jest docs。你可以在模拟一个函数时返回不同的值,一旦返回一个你想要的值,然后再返回一个不同的值。

    【讨论】:

    • 好的,这已经很有帮助了。但是将值传递给这个 mock 呢?基本上我想在一种情况下传递给它{a: 1, b:2},在另一种情况下传递给{}
    【解决方案2】:

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

    使用mockReturnValueOnce

    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,看起来很实用,谢谢大佬!
    • 如果 Jest 文档能如此有用和简洁就好了。谢谢。
    猜你喜欢
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2020-08-26
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多