【问题标题】:How to mock axios with cookieJarSupport with jest如何用玩笑的 cookieJarSupport 模拟 axios
【发布时间】:2020-05-13 18:42:35
【问题描述】:

这是我运行良好的代码

const axios = require('axios')
const axiosCookieJarSupport = require('axios-cookiejar-support').default
const tough = require('tough-cookie')

axiosCookieJarSupport(axios)

async function getData() {
  let cookieJar = new tough.CookieJar()

  try {
    await axios.post({ jar: cookieJar, withCredentials: true, url: '/user' })
    const data = await axios.post({ jar: cookieJar, withCredentials: true, url: '/token' })

    return data
  } catch (error) {
    console.error(error)
    return error
  }
}

module.exports.getData = getData

这是我的 Jest 测试:

const axios = require('axios');
const getData = require('../getData');

jest.mock("axios");

test('test axios and return data', async () => {
  axios.post.mockImplementation((options) => {
    switch (options.url) {
      case '/user':
        return Promise.resolve({ user: 'John' });
        break;
      case ORMB_URL:
        return Promise.resolve({ token: 'testtoken' });
        break;
      default:
        return Promise.reject(new Error('not found'))
    }
  });

  const data = await getData.getData();
  console.log(data);
})

现在,Jest 失败了:

axios.post.mockImplementation((options) => {

有错误:

TypeError: axios.post.mockImplementation is not a function

如果我在源代码中评论这一行似乎有效:

axiosCookieJarSupport(axios)

但这正是我现在所需要的。所有其他调用都将失败并注释此行。我做错了什么?

【问题讨论】:

  • 我遇到了完全相同的问题,一些测试用例文件正在工作,而另一些则失败并出现相同的错误,即使代码几乎相同。如果我删除 axiosCookieJarSupport(axios),一切都会正常工作。你找到解决办法了吗?

标签: node.js unit-testing jestjs


【解决方案1】:
axios.post = jest.fn().mockImplementation((options) => { 
    switch (options.url) {
      case '/user':
        return Promise.resolve({ user: 'John' });
        break;
      case ORMB_URL:
        return Promise.resolve({ token: 'testtoken' });
        break;
      default:
        return Promise.reject(new Error('not found'))
    }
  });

【讨论】:

    【解决方案2】:

    axiosCookieJarSupport(axios) 通过创建axios 的新实例来改变参数axios after 开玩笑地模拟了默认导出上的所有函数。这本质上是覆盖了开玩笑的模拟函数。您可以模拟axios-cookiejar-support 的实现以返回传递的实例,或者您应该创建axios 的新实例并将其传递给axiosCookieJar 支持以避免副作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-15
      • 2021-11-04
      • 2021-05-27
      • 2021-01-06
      • 2020-02-08
      • 1970-01-01
      • 2022-10-06
      • 2020-12-17
      相关资源
      最近更新 更多