javascript - 如何模拟函数,即在 axios promise 的 "then"中调用的函数?

标签 javascript mocking jestjs

我有一个功能,就是从后端获取数据。当 fetch 成功时,它从响应中提取一个值,然后调用另一个函数(parseAllRecordsData),将该值转换为另一个值。我正在尝试测试此函数,但在模拟 parseAllRecordsData 函数后,它仍在尝试调用原始函数(并从该函数中抛出错误)。

在其他测试中,jest.fn 或 jest.spy 工作正常,但当我尝试模拟“then”中使用的函数时,它不是。

export function fetchAllRecordsData(payload) {
    const url = `/apis/${payload.link.split('apis/')[1]}`;
    return axios.get(url)
        .then(({ data }) => {
            if (data && data._embedded) {
                const parsedData = data._embedded['taxonomies:entry'];
                const arrayData = parseAllRecordsData(parsedData, payload);
                return { data: List(arrayData) };
            }
            return { data: List([]) };
        })
        .catch((error) => ({ error }));
}

还有我的测试:

describe('fetchAllRecordsData', () => {
    const mockedPayload = {
        link: 'apis/ok_link',
    };

    beforeAll(() => {
        jest.spyOn(LegalListRecordsApi,'parseAllRecordsData').mockReturnValue(['test']);
    });

    it('test', async () => {
        const test = await LegalListRecordsApi.fetchAllRecordsData(mockedPayload);
        expect(test).toEqual(1);
    });
});

当它像这样被调用时,parseAllRecordsData 调用真正的函数,并抛出错误,因为模拟的 Axios 响应没有解析函数使用的一些值。我只对返回值感兴趣,对调用此函数不感兴趣。

最佳答案

jest.spyOn(LegalListRecordsApi,'parseAllRecordsData').mockReturnValue(['test']);parseAllRecordsData 模拟模块导出 .

这对 fetchAllRecordsData 没有任何影响,因为它与 parseAllRecordsData 在同一个模块中并且直接调用它。 p>

ES6 模块 supports cyclic dependencies这样您就可以将模块导入自身。

将模块导入自身并使用模块调用parseAllRecordsData:

import * as LegalListRecordsApi from './LegalListRecordsApi';  // import module into itself

export function fetchAllRecordsData(payload) {
  const url = `/apis/${payload.link.split('apis/')[1]}`;
  return axios.get(url)
    .then(({ data }) => {
      if (data && data._embedded) {
        const parsedData = data._embedded['taxonomies:entry'];
        const arrayData = LegalListRecordsApi.parseAllRecordsData(parsedData, payload);  // use the module
        return { data: List(arrayData) };
      }
      return { data: List([]) };
    })
    .catch((error) => ({ error }));
}

...当您模拟 parseAllRecordsData 的模块导出时,调用将被模拟。

关于javascript - 如何模拟函数,即在 axios promise 的 "then"中调用的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54552088/

相关文章:

javascript - DriveApp.GetFoldersByName() 总是返回 true

testing - 开 Jest beforeEach/afterEach 只是这个范围内的 block ?

angular - Monorepo 中的 Jest 项目无法在项目中找到配置文件

python - 我可以使用部分实现来建立测试期望吗?

node.js - 诗农模拟正在调用真正的方法

javascript - 使用 jQuery 的 AJAX 调用中的 url 字段格式

javascript - Chromium 和 Safari 中不同的 `String` 函数行为

javascript - 如何从 Google Sheet App Script 返回#N/A?

Ruby 的 vcr 的 Java 替代品?

python - 从 __getattr__ 方法检索的模拟函数