我有一个功能,就是从后端获取数据。当 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/