Vue test-utils, как проверить router.push()
В моем компоненте у меня есть метод, который будет выполнять router.push()
import router from "@/router";
// ...
export default {
// ...
methods: {
closeAlert: function() {
if (this.msgTypeContactForm == "success") {
router.push("/home");
} else {
return;
}
},
// ....
}
}
Я хочу проверить это...
Я написал следующие спецификации..
it("should ... go to home page", async () => {
// given
const $route = {
name: "home"
},
options = {
...
mocks: {
$route
}
};
wrapper = mount(ContactForm, options);
const closeBtn = wrapper.find(".v-alert__dismissible");
closeBtn.trigger("click");
await wrapper.vm.$nextTick();
expect(alert.attributes().style).toBe("display: none;")
// router path '/home' to be called ?
});
1 - я получаю ошибку
console.error node_modules/@vue/test-utils/dist/vue-test-utils.js:15
[vue-test-utils]: could not overwrite property $route, this is usually caused by a plugin that has added the property asa read-only value
2 - Как я должен написать функцию Expect(), чтобы быть уверенным, что этот / домашний маршрут был вызван
спасибо за отзыв
3 ответа
Вы делаете что-то, что случается с работой, но я считаю, что это неправильно, а также вызывает проблемы с тестированием маршрутизатора. Вы импортируете роутер в свой компонент:
import router from "@/router";
Затем зовет его push
сразу:
router.push("/home");
Я не знаю, как именно вы устанавливаете маршрутизатор, но обычно вы делаете что-то вроде:
new Vue({
router,
store,
i18n,
}).$mount('#app');
Для установки плагинов Vue. Могу поспорить, что вы уже делаете это (на самом деле, этот механизм, который разоблачает $route
к вашему компоненту). В этом примере также устанавливается хранилище vuex и ссылка на vue-i18n.
Это выставит $router
член во всех ваших компонентах. Вместо того, чтобы импортировать маршрутизатор и вызвать его push
напрямую, вы можете позвонить из this
как $router
:
this.$router.push("/home");
Теперь это облегчает тестирование, потому что вы можете передать фальшивый маршрутизатор на ваш компонент при тестировании через mocks
собственность, так же, как вы делаете с $route
уже:
const push = jest.fn();
const $router = {
push: jest.fn(),
}
...
mocks: {
$route,
$router,
}
И тогда, в вашем тесте, вы утверждаете против push
будучи вызванным:
expect(push).toHaveBeenCalledWith('/the-desired-path');
Предполагая, что вы настроили предварительные требования правильно и аналогично этому
Просто используйте
it("should ... go to home page", async () => {
const $route = {
name: "home"
}
...
// router path '/home' to be called ?
expect(wrapper.vm.$route.name).toBe($route.name)
});
Нет проблем, я понял это правильно... и я понимаю, что это. Использование маршрутизатора $