【问题标题】:How to mock Axios service wrapper using JEST如何使用 JEST 模拟 Axios 服务包装器
【发布时间】:2021-05-28 04:25:54
【问题描述】:

我正在使用 JEST 测试框架为我的 React JS 应用程序编写测试用例。我正在使用我们内部的 axios 包装器进行服务调用。我想使用 JEST 模拟该包装服务。有人可以帮我吗?

import Client from 'service-library/dist/client';
import urls from './urls';
import { NODE_ENV, API_VERSION } from '../screens/constants';
const versionHeader = 'X-API-VERSION';
class ViewServiceClass extends Client {
  getFiltersList(params) {
    const config = {
      method: urls.View.getFilters.requestType,
      url: urls.View.getFilters.path(),
      params,
      headers: { [versionHeader]: API_VERSION },
    };
    return this.client.request(config);
  }
const options = { environment: NODE_ENV };
const ViewService = new ViewServiceClass(options);
export default ViewService;

以上是进行 API 调用的服务实现。我正在利用我们内部库中的 axios 实现。

getFiltersData = () => {
    const params = {
      filters: 'x,y,z',
    };
    let {
      abc,
      def,
      ghi
    } = this.state;
    trackPromise(
      ViewService.getFiltersList(params)
        .then((result) => {
          if (result.status === 200 && result.data) {
            const filtersJson = result.data;
            
        .catch(() =>
          this.setState({
            alertMessage: 'No Filters Data Found. Please try after some time',
            severity: 'error',
            showAlert: true,
          })
        )
    );
  };

我正在使用 ViewService 来获取响应,并且我想模拟这个服务。有人可以帮我吗?

【问题讨论】:

    标签: reactjs jestjs axios jest-fetch-mock


    【解决方案1】:

    您需要从 ViewServiceClass 类中窥探您的 getFiltersList 方法。

    然后模拟一些响应数据(Promise),类似于:

    import ViewService from '..';
    
    const mockedData = {
      status: 'ok',
      data: ['some-data']
    };
    
    const mockedFn = jest.fn(() => Promise.resolve(mockedData));
    
    let getFiltersListSpy;
    
    // spy the method and set the mocked data before all tests execution
    beforeAll(() => {
      getFiltersListSpy = jest.spyOn(ViewService, 'getFiltersList');
      getFiltersListSpy.mockReturnValue(mockedFn);
    });
    
    // clear the mock the method after all tests execution
    afterAll(() => {
      getFiltersListSpy.mockClear();
    });
    
    // call your method, should be returning same content as `mockedData` const
    test('init', async () => {
      const response = await ViewService.getFiltersList();
      expect(response).toEqual(mockedData);
    });
    

    P.D:您可以将params 传递给该方法,但您还需要根据需要配置mockedData

    【讨论】:

    • 我已经更新了这个问题,实际上我正在制作 API 调用内部 getFiltersData 方法。在这种情况下,我必须监视 getFiltersData 正确吗?
    • getFiltersData 在另一个班级?确实,应该工作!只需在示例中替换您的新方法即可。
    • 不在同一调用中的不同调用中,但 getFilterList 存在于 ViewService 类中。就像我在上面提到的问题一样。@AdriSolid
    • 当我在我的测试类中正确放置 beforeAll 和 afterAll 方法时,它起作用了。
    猜你喜欢
    • 2023-04-02
    • 2021-06-19
    • 2022-07-21
    • 1970-01-01
    • 2023-01-30
    • 2022-06-28
    • 2021-09-13
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多