Javascript 如何模拟函数,即在;然后";在axios的承诺?

Javascript 如何模拟函数,即在;然后";在axios的承诺?,javascript,mocking,jestjs,Javascript,Mocking,Jestjs,我有一个函数,就是从后端获取数据。当fetch成功时,它从响应中提取一个值,然后调用另一个函数(parseAllRecordsData),将该值转换为其他值。我试图测试这个函数,但在模拟parseAllRecordsData函数之后,它仍然试图调用原始函数(并从该函数中抛出错误) 在其他测试中,jest.fn或jest.spy工作正常,但当我试图模拟在“then”中使用的函数时,情况并非如此 export function fetchAllRecordsData(payload) { c

我有一个函数,就是从后端获取数据。当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响应没有解析函数使用的某些值。我只对返回值感兴趣,不调用这个函数

export function fetchAllRecordsData(payload, axiosInterface = axios) {
  return return axiosInterface.get(url)
   . then(({ data }) => {
      // your code
    })
   .catch((error) => ({ error }))
}
所以,您需要使用方法get创建模拟对象,方法get应该返回承诺

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

这对
fetchAllRecordsData
没有任何影响,因为它与
parseAllRecordsData
位于同一模块中,并且直接调用它

ES6模块,以便您可以将模块导入自身

将模块导入自身并使用模块调用
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

模拟模块导出时,调用将被模拟,我从未想过这会起作用,但它确实起作用。谢谢你。@ZenekWiaderko不客气,很高兴听到这很有帮助!