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