#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