Не может получить состояние vuex с помощью Cypress

Я слежу за этим блогом. Свойство window.app действительно появляется в консоли после добавления кода, как описано, однако я не могу сослаться app.$store ANS упоминается в блоге (и напоминает способ ссылки на магазин внутри компонентов). Я могу ссылаться app.store который действительно содержит свойства из моего магазина Vuex, но он не содержит app.store.state, только получатели (и рассылки и т. д.).

Например, используя const getStore = () => cy.window().its('app.store') это дает:

скриншот с 2018-04-26 09-27-25

Я бы предпочел, чтобы переменные состояния были доступны напрямую, а не только после того, как я сделал геттер. В чем дело? Это потому, что я использую пространство имен в моем магазине 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
}

Обратите внимание, что это не стандартный плагин квазар-приложения.

Другие вопросы по тегам