首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用/ Jest模拟axios帖子

使用/ Jest模拟axios帖子
EN

Stack Overflow用户
提问于 2021-10-14 16:44:11
回答 1查看 10.7K关注 0票数 2

我正在努力弄清楚如何在我的反应测试中正确地模拟这个Axios帖子。似乎文档和教程中到处都是他们是如何做到这一点的,没有很强的共识或最佳实践。

下面是我的测试: BatchList.test.js

代码语言:javascript
运行
复制
import React from 'react';
import { setupWorker, rest } from 'msw';
import {
    render,
    screen,
    within,
    fireEvent,
    waitFor,
} from '@testing-library/react';
import '@testing-library/jest-dom';
import { Provider as AlertProvider } from 'react-alert';
import AlertMUITemplate from 'react-alert-template-mui';
import BatchList from './BatchList';
import mockedAxios from 'axios';

// ... other tests that succeed here ...

// only test that fails here
test('clicking yes and passing back only 2 valid batch numbers should show 2 valid, 2 invalid batch numbers in list', async () => {
    // renderBatchListWithNumbers();
    const batchList = render(
        <AlertProvider template={AlertMUITemplate}>
            <BatchList
                formulaID={''}
                orderID={''}
                itemID={''}
                formulaResults={[]}
                batchNumbers={[
                    { BATCH_ID: '987654', ID: '78' },
                    { BATCH_ID: '261010', ID: '79' },
                    { BATCH_ID: '301967', ID: '80' },
                    { BATCH_ID: '445566', ID: '81' },
                ]}
                setBatchNumbers={mockedEmptyFn}
                batchNumber={'5'}
                setBatchNumber={mockedEmptyFn}
            />
        </AlertProvider>
    );
    const completeButton = batchList.getByText('Complete');
    fireEvent.click(completeButton);
    const yesButton = batchList.getByText('Yes');
    expect(yesButton).toBeInTheDocument();
    fireEvent.click(yesButton);

    // now we need to figure out mocking the API calls!!!
    const data = {
        msg: 'fail',
        invalidBatchNumbers: ['987654', '445566'],
    };
    mockedAxios.post.mockResolvedValueOnce({
        data: data,
    });

    await waitFor(() => {

        expect(batchList.getByText('987654')).toHaveClass('invalid');
        expect(batchList.getByText('261010')).toHaveClass('valid');
    });
});

下面是我__mocks__文件夹中的__mocks__

代码语言:javascript
运行
复制
export default {
    post: jest.fn().mockResolvedValue(),
};

所以我在测试中遇到的错误是:thrown: "Unable to complete all batches - TypeError: (0 , _axios.default) is not a function"

该错误消息字符串来自我的客户端API调用:

代码语言:javascript
运行
复制
export const completeAllBatches = async (
    orderID,
    itemID,
    batchNumbers
) => {
    const completeAllBatchesURL =
        serverURL + `:${port}/completeAllBatches`;

    try {
        return await axios({
            method: 'post',
            url: completeAllBatchesURL,
            timeout: shortTimeout,
            data: {
                orderID,
                itemID,
                batchNumbers,
            },
        })
            .then((res) => {
                return res;
            })
            .catch((e) => {
                return Promise.reject(
                    '1: Unable to complete all batches - ' + e
                );
            });
    } catch (e) {
        return Promise.reject('2: Unable to complete all batches - ' + e);
    }
};
EN

回答 1

Stack Overflow用户

发布于 2021-10-15 03:21:02

我解决了一个类似的问题,也许这是有用的?

为什么要休息?

  • 我认为问题在于,打字本不知道如何处理axios.post的一些复杂性。

我不是像模仿的那样导入默认值,而是按正常方式导入。

代码语言:javascript
运行
复制
import axios from 'axios'
jest.mock('axios');

那么我对模拟就更明确了一点。

代码语言:javascript
运行
复制
const mockedAxios = axios as jest.Mocked<typeof axios>;
let payload:object = {}
const mockedPost = mockedAxios.post.mockReturnValueOnce(payload);
//I highly recommend separating out api client like in the tutorial, then call that api function...
const data = await postBatch();
expect(axios.post).toHaveBeenCalled();

如果这对你有用的话,我还在玩我的反应测试模式:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69574437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档