Reactjs 使用Jest测试异步API调用时使用mockResolvedValue
我在寻找一些我在网上找不到的信息 我找到了一篇文章,帮助我用axios编写了一个基本测试 基本上是这样的,Reactjs 使用Jest测试异步API调用时使用mockResolvedValue,reactjs,jestjs,Reactjs,Jestjs,我在寻找一些我在网上找不到的信息 我找到了一篇文章,帮助我用axios编写了一个基本测试 基本上是这样的, // App.test.js import axios from 'axios'; import { getLayoutScreen } from '..'; import { layoutScreen } from '../data'; jest.mock('axios'); const getLayoutScreen = async () => { const { d
// App.test.js
import axios from 'axios';
import { getLayoutScreen } from '..';
import { layoutScreen } from '../data';
jest.mock('axios');
const getLayoutScreen = async () => {
const { data } = await axios.get('get-layout-screen');
return data;
};
it('returns the correct screen layout', async () => {
axios.get.mockResolvedValue({
data: layoutScreen,
});
const screen = await getLayoutScreen();
console.log('screen', screen);
expect(screen).toEqual(layoutScreen);
});
const layoutScreen = {
screen: {
sidebarOptions: [
{
name: 'Home',
uri: '/',
},
{
name: 'Settings',
uri: '/settings',
},
],
navbarOptions: [
{
name: 'Search',
uri: '/search',
},
],
},
};
export default layoutScreen;
在这里,我覆盖了axios
的所有方法,并在其get
方法上设置了一个自定义的“data”
属性
layoutScreen
看起来像这样
// App.test.js
import axios from 'axios';
import { getLayoutScreen } from '..';
import { layoutScreen } from '../data';
jest.mock('axios');
const getLayoutScreen = async () => {
const { data } = await axios.get('get-layout-screen');
return data;
};
it('returns the correct screen layout', async () => {
axios.get.mockResolvedValue({
data: layoutScreen,
});
const screen = await getLayoutScreen();
console.log('screen', screen);
expect(screen).toEqual(layoutScreen);
});
const layoutScreen = {
screen: {
sidebarOptions: [
{
name: 'Home',
uri: '/',
},
{
name: 'Settings',
uri: '/settings',
},
],
navbarOptions: [
{
name: 'Search',
uri: '/search',
},
],
},
};
export default layoutScreen;
我对开玩笑的测试非常陌生,我试图理解这个特殊的测试有什么意义
对我来说,我觉得这个特殊的测试永远不会失败,原因很简单,我总是做出响应。数据等于布局屏幕
换句话说,这就像说
x is equal to A
set y equal to x
check if y is equal x
或者
我是否遗漏了价值的某些关键方面?这样的测试有什么意义?layoutScreen
是一个从后端服务器接收的对象,将来很容易更改,此测试不会调用任何后端——如果不手动调用服务器,我永远不知道layoutScreen
的结构或数据是否会更改。所有内容都在这里进行了有效的硬编码,并且容易出错
在运行任何测试之前,不要使用mockResolvedValue
,而是让服务器的本地版本运行,这不是更有意义吗?这样,axios将直接调用后端,如果JSON与我的本地副本layoutScreen
不一致,那么测试将失败没有意义,您正在测试const getLayoutScreen
您刚刚在上面写了几行。如果你测试你导入的那个,这是有意义的。我永远也不知道layoutScreen的结构或数据是否会改变——如果你也用测试覆盖了后端,你会改变的。在运行任何测试之前,请先运行服务器的本地版本这就是e2e和集成测试的意义所在,它们也是需要的,但不能替代单元测试覆盖率。