Не может получить состояние vuex с помощью Cypress
Я слежу за этим блогом. Свойство window.app действительно появляется в консоли после добавления кода, как описано, однако я не могу сослаться app.$store
ANS упоминается в блоге (и напоминает способ ссылки на магазин внутри компонентов). Я могу ссылаться app.store
который действительно содержит свойства из моего магазина Vuex, но он не содержит app.store.state
, только получатели (и рассылки и т. д.).
Например, используя const getStore = () => cy.window().its('app.store')
это дает:
Я бы предпочел, чтобы переменные состояния были доступны напрямую, а не только после того, как я сделал геттер. В чем дело? Это потому, что я использую пространство имен в моем магазине Vuex?
РЕДАКТИРОВАТЬ: Это также может относиться к моему способу назначения магазина в окне. Я использую Quasar Framework, который в текущей версии (>0.15) выполняет много настроек на основе настроек в quasar.conf.js
файл, который он использует. Я назначил магазин, добавив этот код в качестве плагина квазар:
export default ({ app, store, Vue }) => {
if (window.Cypress) { // should only be available during E2E tests
window.app = app
}
}
Это дает мне действительно app.store
Я упоминал, но не app.$store
(в том числе state
). Quasar config генерируется и отображается в файле, который после добавления этого плагина содержит:
/**
* THIS FILE IS GENERATED AUTOMATICALLY.
* DO NOT EDIT.
*
* You are probably looking on adding initialization code.
* Use "quasar new plugin <name>" and add it there.
* One plugin per concern. Then reference the file(s) in quasar.conf.js > plugins:
* plugins: ['file', ...] // do not add ".js" extension to it.
**/
import './quasar'
import Vue from 'vue'
Vue.config.productionTip = false
import 'quasar-app-styl'
import 'src/css/app.styl'
import App from 'src/App'
import router from 'src/router'
import store from 'src/store'
const app = {
el: '#q-app',
router,
store,
...App
}
const plugins = []
import pluginCypress_vuex_store from 'src/plugins/cypress_vuex_store'
plugins.push(pluginCypress_vuex_store)
import pluginVuelidate from 'src/plugins/vuelidate'
plugins.push(pluginVuelidate)
plugins.forEach(plugin => plugin({ app, router, store, Vue }))
new Vue(app)
Как вы можете видеть, плагины являются частью инициализации приложения Vue, в то время как блог и вы предлагаете его, он присоединяется после инициализации Vue. Поскольку Quasar автоматически генерирует конфигурацию, я не знаю, как сделать 'window.app = app' после инициализации, чтобы увидеть, вызывает ли это мою проблему...
1 ответ
То же самое в моем приложении Vue. Смотрите этот раздел
Прежде чем написать тест, нам нужно решить, как добраться до магазина. Чтобы разрешить тестирование и управление приложением через экземпляр Vue, я предпочитаю сохранять ссылку на компонент в объекте window. В app.js установите window.app для тестируемости.
const app = new Vue({
store,
el: '.todoapp'
//
})
window.app = app
Последняя строка - ключ, когда я добавляю, что тестовый код работает так, как объявлено.
Обратите внимание, что файл для настройки может быть main.js, а не app.js.
Quasar - плагин для специальных приложений: Boot
Ref этот документ, вы можете добиться правильного Cypress window.app
ссылка, создав этот специальный плагин, затем изменив его на
export default ({ app, Vue }) => {
// do some logic here...
// ... then, kick off our Quasar website/app:
window.app = new Vue(app)
// "app" has everything cooked in by Quasar CLI,
// you don't need to inject it with anything at this point
}
Обратите внимание, что это не стандартный плагин квазар-приложения.