Reactjs 使用Jest测试异步API调用时使用mockResolvedValue

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

我在寻找一些我在网上找不到的信息

我找到了一篇文章,帮助我用axios编写了一个基本测试

基本上是这样的,

// 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和集成测试的意义所在,它们也是需要的,但不能替代单元测试覆盖率。