Как имитировать вызов axios внутри метода?

#vue.js #jestjs

#vue.js #jestjs

Вопрос:

Я пытаюсь имитировать вызов axios в методе vuejs. Возможно ли это?

Вот мой компонент vue (someObj):

  methods:{
        callAxiosMethod() { 
          const callApi= axios.create();
          callApi.defaults.timeout = 10000;
          callApi.get(mockedUrl)
          .then(response => {
             console.log('response is '   response);
          })
          .catch(e => {});
        }
    }
  

Вот мой spec.js

 let mockData = {};
beforeEach(() => {
        jest.spyOn(axios, 'get').mockReturnValue(Promise.resolve(mockData));
    });

    let wrapper = shallowMount(SomeObj, {
        stubs: [], localVue, mocks: {
            mockUrl: mockUrl,
            $route: {
                params: { testId: "123" }
            }
        }
    });
    it('is a Vue instance', () => {
        expect(wrapper.isVueInstance()).toBeTruthy();
        axios.get.mockResolvedValue(mockData);
        wrapper.vm.callAxiosMethod();
    })
  

Когда я посмотрел на покрытие, система говорит, что callApi не покрыт. Есть идеи о том, как я могу имитировать вызов axios внутри функции?

Ответ №1:

Ваш код вызывает, axios.create поэтому вам нужно имитировать эту функцию, чтобы вернуть макет callApi объекта.

Вот упрощенный рабочий пример:

code.js

 import * as axios from 'axios';

const mockedUrl = 'http://mock-url';

export const callAxiosMethod = () => {
  const callApi = axios.create();
  callApi.defaults.timeout = 10000;
  return callApi.get(mockedUrl);  // <= return the Promise so it can be awaited
}
  

code.test.js

 import { callAxiosMethod } from './code';

jest.mock('axios', () => ({
  create: jest.fn().mockReturnValue({
    defaults: {},
    get: jest.fn().mockResolvedValue('mocked data')
  })
}));

test('callAxiosMethod', async () => {  // <= async test function
  const response = await callAxiosMethod();  // <= await the Promise
  expect(response).toBe('mocked data');  // Success!
});
  

Комментарии:

1. спасибо Брайану за информацию. Я использовал его, и ошибки не было. Однако в моем охвате говорится, что callApi.get (mockedUrl) не был охвачен. Знаете ли вы, почему?

2. Я обновил свой ответ, чтобы использовать jest.mock с заводской функцией , поскольку она немного чище.

3. хм … не уверен, почему это не считается callApi.get(mockedUrl) покрытым. Вы вернули Promise и await это? catch Все еще в вашем коде … если это так, вам нужно добавить тест, который выдает ошибку, чтобы покрыть это. @arn-arn