【问题标题】:Test then() inside of a promise API call jest在 promise API 调用 jest 中测试 then()
【发布时间】:2019-11-06 17:30:41
【问题描述】:

我正在尝试测试一个作为 api 调用/承诺的函数,以便我可以使用 jest 检查 then 内部的状态,但似乎无法弄清楚该怎么做。我试过模拟文件和函数来返回一个承诺,但得到一个错误TypeError: (0 , _dataAccess.fetchBundlesFromApi) is not a function 我试过关注 jests 网站上的文档以及堆栈溢出的许多不同答案,但似乎没有一个有效。这是我要测试的代码。我希望能够调用它,然后说是否可以检查状态或错误是否执行其他操作。下面是我正在尝试做的代码和我尝试过的模拟。

getLatestPrices = params => {
    const { updateBundles } = this.props;

    fetchBundlesFromApi(params)
      .then(({ data: { bundles } }) => {
        updateBundles(bundles);
        this.setState({ showUpdatingPrices: false });
        window.TemplateCalculator.reload();
      })
      .catch(() => goToUrl(bundlesUrl));
  };`

fetchBundlesFromApiimport { fetchBundlesFromApi } from '../../../../dataAccess';,这是一个 axios 调用:

const fetchBundlesFromApi = params => axios(`${bundleRoute}/bundles${params}`);

export { fetchBundlesFromApi };

这是我试过的嘲讽。

jest.mock('../../../../dataAccess', () => ({
      fetchBundlesFromApi: new Promise(resolve => resolve({ data: mockBundles })),
    }));

我也试过这些网站: https://binarapps.com/blog/test-ajax-calls-in-react-component-lifecycleJest/Enzyme Error: "Method 'setState' is only meant to run on a single node. 3 found instead." https://jestjs.io/docs/en/asynchronous

【问题讨论】:

  • 请编辑您的代码,goToUrl 函数和bundlesUrl,它们来自哪里?
  • ‘goToUrl’ 只是一个导入来进行重定向的函数。 ‘bundlesUrl’ 也只是一个导入的变量,它只是一个字符串。

标签: javascript reactjs testing jestjs


【解决方案1】:

我发现我必须像这样导入我的 api 调用函数:

import { fetchBundlesFromApi } from '../../../../dataAccess';

由于该函数使用 axios,我不得不对其进行模拟。我是这样做的:

jest.mock('axios', () => jest.fn(() => Promise.resolve({ data: mockBundles })));

在我的测试中,我将其设为异步,我可以等待该函数响应。

const fetchedBundles = await fetchBundlesFromApi(
  'params',
);

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 2017-09-27
    • 2018-07-06
    • 2018-10-06
    • 2017-07-31
    • 2018-03-24
    • 1970-01-01
    • 2019-05-16
    • 2021-10-16
    相关资源
    最近更新 更多