如何解决如何模拟由 mobx 商店导入的辅助函数发出的异步 axios 请求
我正在尝试为我的 mobX 存储中的一个方法编写测试,该方法调用一个辅助方法 getPages
,该方法进行异步 API 调用以获取一些数据。在为 getPages
辅助函数编写测试时,我成功地模拟了 axios,但现在我正在测试 mobx 商店,我似乎无法再模拟 axios。
是不是因为store文件没有直接导入axios?
我是否必须模拟 getPages
辅助函数?如果是这样,我该怎么做?
目前 API 调用 await axios.get('${process.env.REACT_APP_BACKEND_URL}/pages');
返回的是 undefined
而不是模拟值。最终我只需要这个调用来返回模拟值。
谢谢
MobX 商店
import { makeAutoObservable } from 'mobx';
import { getPages } from 'lib/api';
class DocumentStore {
pages = [];
currentPage = null;
constructor() {
makeAutoObservable(this);
}
setPages = (pages) => {
this.pages = pages;
return this.pages;
};
setCurrentPage = (page) => {
this.currentPage = page;
return this.currentPage;
};
getPages = async (documentName) => {
const pageUrls = await getPages('a-test',documentName);
this.setCurrentPage(pageUrls[0]);
this.setPages(pageUrls);
};
}
export default DocumentStore;
API 调用
export const getPages = async () => {
let resp;
try {
resp = await axios.get(
`${process.env.REACT_APP_BACKEND_URL}/pages`,);
} catch (err) {
throw new Error(err);
}
if (resp?.data?.urls) {
return resp.data.urls;
} else {
throw new Error('Unable to fetch Urls');
}
};
测试文件
import DocumentStore from './index';
import axios from 'axios';
const TEST_PAGES = [
{
url: 'URL1',},{
url: 'URL2',{
url: 'URL3',];
const FETCH_PAGES_MOCK = {
data: {
urls: TEST_PAGES,};
jest.mock('axios');
describe('DocumentStore',() => {
describe('getPages',() => {
axios.get.mockResolvedValue(FETCH_PAGES_MOCK);
it('fetches pages',() => {
const store = new DocumentStore();
expect(store.pages.length).toEqual(0);
store.getPages();
expect(store.pages.length).toEqual(3);
});
});
});
解决方法
模拟间接依赖(axios.get()
)和模拟直接依赖(getPages
模块中的lib/api
),它们都可以。取决于您希望将哪些模块作为一个单元。我更喜欢较小的单元,只模拟测试代码直接依赖的模块。
过大的单元会使测试更加复杂,难以定位问题。庞大的单元接近更高级别的测试,例如集成测试、e2e 测试。
对于您的情况,您在调用 await
方法时忘记使用 store.getPages()
。
例如
index.test.js
:
jest.mock('axios');
describe('DocumentStore',() => {
describe('getPages',() => {
axios.get.mockResolvedValue(FETCH_PAGES_MOCK);
it('fetches pages',async () => {
const store = new DocumentStore();
expect(store.pages.length).toEqual(0);
await store.getPages('test');
expect(store.pages.length).toEqual(3);
expect(axios.get).toBeCalled();
});
});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。