为什么TypeError:axios.create不是函数?测试axios GET时

Leo*_*ban 6 testing unit-testing axios axios-mock-adapter

我正在尝试在React中测试我的axios API函数。

在这里发现了这个问题:我如何在笑话测试axios,它指向使用axios-mock-adapter

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import chatbot from './chatbot';

describe('Chatbot', () => {
    it('returns data when sendMessage is called', done => {
        var mock = new MockAdapter(axios);
        const data = { response: true };
        mock.onGet('https://us-central1-hutoma-backend.cloudfunctions.net/chat').reply(200, data);

        chatbot.sendMessage(0, 'any').then(response => {
            expect(response).toEqual(data);
            done();
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

真正的功能:

/**
 * Retrieve all Akamai images
 * @param  {String} akamai Akamai url
 * @return {Thenable}      Resolved: Akamai images
 */
export const callGetAkamai = () =>
  makeRequest('/akamai', 'GET')
    .catch(defaultCatch('callGetAkamai'));
Run Code Online (Sandbox Code Playgroud)

我的测试:

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
import { callGetAkamai } from './api';

describe('GetAkamai', () => {
  it('returns data when callGetAkamai is called', (done) => {
    console.log('MockAdapter', MockAdapter);
    const mock = new MockAdapter(axios);
    // const mock = axios.create({
    //   baseURL: 'https://us-central1-hutoma-backend.cloudfunctions.net/chat/'
    // });

    const data = { response: true };
    mock.onGet('https://us-central1-hutoma-backend.cloudfunctions.net/chat').reply(200, data);

    callGetAkamai().then((response) => {
      expect(response).toEqual(data);
      done();
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Joh*_*der 6

你在嘲笑axios吗 我遇到了这个问题我自己,并期待在错误的地方后,我意识到我已经嘲笑axiosjest

将以下代码段放入setupTestFrameworkScriptFile中

const mockNoop = () => new Promise(() => {});

// Notice how `create` was not being mocked here...
jest.mock('axios', () => ({
  default: mockNoop,
  get: mockNoop,
  post: mockNoop,
  put: mockNoop,
  delete: mockNoop,
  patch: mockNoop
}));
Run Code Online (Sandbox Code Playgroud)

虽然您可能同时做到这两个,但是如果您使用axios-mock-adapter,则可能要删除其他模拟(并跳过上面的代码段)。


小智 6

在此处添加此内容,因为它是 google 上对该问题的第一次点击,并且所选的答案并未真正回答该问题。

当您已经在模拟 axios(很可能在__mocks__文件夹中)时,通常会发生此问题。

开玩笑,您可以显式取消模拟,然后调用 this axios-mock-adapter

jest.unmock('axios');
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
...
Run Code Online (Sandbox Code Playgroud)

axios-mock-adapter在处理外部请求时提供漂亮、灵活的 api。但是,它不会全局阻止您的应用程序进行可由不同组件中的测试触发的外部调用。

所以我发现axios-mock-adapter__mocks__文件夹中使用和进行手动模拟同样有帮助。