Я использовал Moxios для имитации вызовов API в Vue shallowMount
ed Компоненты без проблем, но после многих попыток мне не удалось смоделировать вызов Axios API, выполненный в действии Vuex ...
Это мой минимальный src/store/actions.js
:
import axios from "axios";
import queryString from "query-string";
const api = axios.create({
baseURL: "https://api.example.com/service",
});
export default {
fetch: function(context, params) {
context.commit("startLoading");
api
.request({
url: `/endpoint?${queryString.stringify(params)}`,
method: "get"
})
.then(response => {
context.commit("processResponse", response.data);
})
.catch(error => context.commit("errorFlag"))
.finally(() => context.commit("stopLoading"));
}
};
И мой spec
файл:
import moxios from "moxios";
import store from "@/store";
import actions from "@/store/actions";
import response from "./mock-data/response.json";
describe("fetch action", () => {
beforeEach(() => {
moxios.install();
});
afterEach(() => {
moxios.uninstall();
});
it("should fetch its stuff", done => {
moxios.stubRequest(/endpoint/, {
status: 200,
response
});
actions.fetch(store, { someparam: "someValue" });
moxios.wait(() => {
expect(store.state.results.stuff.length).toBe(response._meta.total)
done();
});
});
});
Test FAILS, и я также получаю сообщение об ошибке вроде:
console.error node_modules / jsdom / lib / jsdom / virtual-console.js: 29 Ошибка: Uncaught [Ошибка: ожидается (получено) .toBe (ожидается) // Object.is равенство Ожидаемое: 96
Получено: 0]
moxios.wait
обратный вызов выполняется и мутация startLoading
выполняется. Но processResponse
в api
then()
никогда не вызывается.
Я следовал тому же подходу к тестированию Vue Component, с moxios.stubRequest
, и он работал отлично, поэтому я предполагаю, что проблема в том, что, поскольку действия импортируются в тесте, api
создается и moxios
не может действительно захватить и высмеять вызов, но я не совсем уверен в этом ...
Я безуспешно перебираю другие вопросы, связанные с SO, и многие статьи, я не могу понять, что происходит в моем случае ... поэтому любая подсказка / помощь будет высоко оценена!