reactjs - 使用 Jest 模拟 React 的 AJAX 请求

标签 reactjs jestjs

我正在构建一个 React 组件,该组件在安装时通过 AJAX 从服务器获取数据。

我正在尝试(但失败了)在 Jest 中模拟 AJAX 调用,我想知道我是否只是误解了 Jest 中模拟的真正工作原理?

我的文件结构是:

  • index.js
  • index.test.js
  • 请求.js
  • __模拟__
    • 请求.js

组件 (index.js) 通过 requests.js 进行调用,它使用 Axios 从服务器获取数据。 requests.js__mocks__ 文件夹中模拟。

从下面的测试文件 index.test.js 中可以看出,我正在使用 getSpy 来检测 requests.getData 函数被调用。它从来没有。我应该补充一点,我还尝试让组件简单地呈现来自 getData 函数响应的一些数据,然后在测试文件中运行 console.log(ListWrapper .debug()); 以查看数据是否在测试中呈现。再一次,它永远不会。

只是想知道是否有人能发现我哪里出错了,或者我是否只是走错了路?

index.test.js

import React from 'react';
import { mount } from 'enzyme';
import List from './index';
import expect from 'expect';

import requests from './requests';

jest.mock('requests');

describe('Renders list', () => {
    const getSpy = jest.spyOn(requests, 'getData');

    const ListWrapper = mount(
        <ListWrapper />
    );

    console.log(ListWrapper.debug());

    it('should fetch currencies', () => {
        expect(getSpy).toBeCalled();   
    });
});

__mocks__/requests.js

module.exports = {
    getData: () => {
        return new Promise((resolve) => {
            resolve({
               [
                    {
                        id: 1,
                        name: 'Bob Smith',
                        age: 32
                    }
                ]
            });
        });

    }
};

index.js(缩写)

/**
 * List component
 */
import React, { useState, useEffect, useCallback } from 'react';
import * as requests from './requests’;
function List(props) {

  const [data, setData] = useState([]);

   /**
     * Get data from server
     */
   const getCurrencies = useCallback(() => {
      r4_uiTools.loadingAnimation.show();
      requests
          .getData()
          .then((response) => {
              setData(response);
          })
          .catch(error) {
              //...
          }

   /**
     * Get data when first mounting component
     */
    useEffect(() => {
        getData();
    }, [getData]);

  return(
   <>
    /* ... */
    {data[0].name}
   </>
  );

requests.js(缩写)

import axios from 'axios';

const getData = () => {
    return new Promise((resolve, reject) => {
        const url = `/MyURL/`;
        axios
            .get(url)
            .then((response) => {
                resolve(response);
            })
            .catch((error) => {
                reject(error);
            });
    });
};

export { getData };

最佳答案

您的 useEffect 不应该像这样吗?

useEffect(() => {
    getCurrencies();
}, []);

此外,index.test.js 中的 ListWrapper 是什么?是否打错了,应该是 List

关于reactjs - 使用 Jest 模拟 React 的 AJAX 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58378030/

相关文章:

unit-testing - 不变违规 : ReactShallowRenderer render()

node.js - 带有参数的 Jest Express 测试中间件

typescript - 使用 Create React App 和 TypeScript 进行 Jest 测试时的 isolatedModules 错误?

javascript - Jest 无法加载 svg 文件

javascript - react 和 typescript : Convention for classes when no props are being passed

Javascript "export default"到同一文件中的类

javascript - map 内匿名函数内的方法未定义

javascript - React-Mapbox-GL 在状态更新时不断刷新

unit-testing - 如何在抛出错误时忽略 Jest 中的空测试文件

typescript - 如何使用 `ioredis`中的Redis设置RedisService?