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

cwxwcias  于 2023-08-01  发布在  Jest
关注(0)|答案(3)|浏览(139)

我是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()
  })


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

rxztt3cl

rxztt3cl1#

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

使用mockReturnValueOnce

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

字符串
将在第一次调用时返回10,在第二次调用时返回'x',在此之后的任何时间返回true

2-如果要检查mock调用的参数:

使用toHaveBeenNthCalledWith

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


会Assert

  • 第一次调用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!')

x33g5p2x

x33g5p2x2#

这就是我们如何用不同的参数模拟同一个函数两次:

导入Axios:

import axios from 'axios';
jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

字符串

使用mockedAxios:

const mock = jest.spyOn(mockedAxios, 'post');
mock.mockImplementation((url): any => {
  if (url.indexOf('checkAddOnEligibility') > 0) {
    return { data: [{ validationMessage: { value: '' }, isValid: { value: true } }] };
  }
  return {
    data: [
      {
        something: 48945
      },
    ],
  };
});

moiiocjp

moiiocjp3#

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

相关问题