为什么TypeError:创建不是一个函数?测试axios GET时

gywdnpxw  于 2023-04-06  发布在  iOS
关注(0)|答案(3)|浏览(173)

我正在尝试在React中测试我的Axios API函数。
在这里找到这个问题:how do i test axios in jest,指向使用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();
        });
    });
});

真实的的功能:

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

我的测试:

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();
    });
  });
});

olqngx59

olqngx591#

你已经在嘲笑axios了吗?我自己也遇到过这个问题,在看了所有错误的地方之后,我意识到我已经在用jest嘲笑axios了。
将以下代码段放入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
}));

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

hivapdat

hivapdat2#

在这里加上这个,因为这是谷歌上第一次点击这个问题,而选择的答案并没有真正回答这个问题。
当您已经在模拟axios时(很可能在__mocks__文件夹中),通常会发生此问题。
使用jest,可以显式地取消mock,然后调用axios-mock-adapter

jest.unmock('axios');
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
...

axios-mock-adapter在处理外部请求时提供了很好的、灵活的API。但是,它不会全局阻止您的应用进行外部调用,这些调用可能由不同组件中的测试触发。
因此,我发现使用axios-mock-adapter和在__mocks__文件夹中手动模拟同样有帮助。

bmvo0sr5

bmvo0sr53#

您的错误是由于您使用的是带有自定义配置**axios.create([config])**的新axios示例

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

但在测试中你是在测试axios

import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';

const mock = new MockAdapter(axios);

如果你正在创建一个新的axios示例,那么你需要测试它,而不是axios本身。

const mock = new MockAdapter(instance)

相关问题