Тест системы Rails не загружается Vue

В моем приложении rails 5.1 есть функция Vue, которая в основном принимает глубоко вложенную форму. Эта функция прекрасно работает при разработке, подготовке и производстве, однако при использовании новых системных тестов minitest с селеном и капибарой vue не загружается. Поскольку Selenium показывает вам, что происходит в режиме реального времени, я вижу, что элементы rails (такие как _header, _footer, h1-Title) все загружаются нормально, но фрагмент Vue никогда не появляется.

Вот мои настройки тестирования:

Gemfile

group :test do
  gem 'minitest-rails'
  gem 'minitest-reporters'
  gem 'minitest-rails-capybara'
  gem 'faker'
  gem 'capybara', '~> 2.7', '>= 2.7.1'
  gem 'selenium-webdriver'
  gem 'simplecov', :require => false
end

Тест /test_helper.rb

ENV["RAILS_ENV"] = "test"
require 'simplecov'
SimpleCov.start 'rails'
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require "minitest/rails/capybara"
require "minitest/pride"
require 'minitest/reporters'
require "support/test_password_helper"
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new

ActiveRecord::FixtureSet.context_class.send :include, TestPasswordHelper

class ActiveSupport::TestCase
  require "#{Rails.root}/db/seeds.rb"
  fixtures :all
  require 'minitest/autorun'
  include TestPasswordHelper

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  # Add more helper methods to be used by all tests here...
  def sign_in(user)
    post user_session_path \
      'user[email]'    => user.email,
      'user[password]' => user.password
  end

  def submit_form
    find('input[name="commit"]').click
  end
end

Тест /application_system_test_case.rb

require "test_helper"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
  include Devise::Test::IntegrationHelpers
end

тест / система /proposals_test.rb

require "application_system_test_case"

class ProposalsTest < ApplicationSystemTestCase
  test 'create a proposal' do
    sign_in users(:martin)
    @supplier = businesses(:supplier_two)
    @project = projects(:pete_project_three)
    visit dashboard_path

    assert_selector 'h3', text: @supplier.display_name
    assert_link text: 'Propose for project'
    click_on 'Create Proposal'
    assert_selector 'h1', text: 'New Proposal'
    assert_selector 'small', text: '(Version: 1)'
    fill_in 'title0', with: 'This is a title'
    fill_in 'body0', with: 'This is a body'
    click_on 'Add Section'
    fill_in 'title1', with: 'This is a second title'
    fill_in 'body1', with: 'This is a second body'
  end
end

Сам тест не проходит в fill_in 'title0', with: 'This is a title' потому что функция vue не загружается

Заметьте, я использую турболинки, но, как уже упоминалось, на практике все работает идеально, просто не загружается для системных тестов.

Рады предоставить более подробную информацию, если это необходимо

Обновить

Как и было предложено, я смог получить доступ к журналам консоли браузера, используя byugug в тесте (спасибо Томасу), что позволило мне подключиться к консоли, когда тест был приостановлен. Это ошибка в консоли:

 Uncaught Error: Module build failed: SyntaxError: Unexpected token, expected (27:7)

25 | //
26 | 
27 | import import bus from '../bus'
   |        ^
28 | import ClientDetails from './ClientDetails.vue'
29 | import SupplierDetails from './SupplierDetails.vue'
30 | import Sections from './Sections.vue'


at Object.disposed (proposal.js:518)
at __webpack_require__ (proposal.js:20)
at Object.module.exports.render._vm (proposal.js:539)
at __webpack_require__ (proposal.js:20)
at Object.exports.byteLength (proposal.js:15148)
at __webpack_require__ (proposal.js:20)
at module.exports.rawScriptExports (proposal.js:66)
at proposal.js:69

Кажется, проблема может быть с import import опечатка, но это не мое busтак это должен быть сам Vue.js?

1 ответ

Во-первых, вы смешиваете использование Capybara с методами запросов (get, post и т. Д.). Вы не можете сделать это, так как методы запроса не влияют на сеанс, который использует Capybara (недавно была сделана попытка rails отменить определение методов запроса в SystemTestCase из-за путаницы, которую они вызывают - https://github.com/rails/rails/commit/1aea1ddd2a4b3bfa7bb556e4c7cd40f9531ac2e3). Чтобы это исправить sign_in Метод должен измениться, чтобы фактически посетить страницу, заполнить поля и отправить форму. Во-вторых, в конце sign_in вам нужно подтвердить что-то, что указывало бы, что вход в систему завершен. Если это не сделано, визит сразу же после звонка sign_in Это может произойти до того, как файлы cookie будут отправлены обратно в браузер, и вы все равно можете не войти в систему.

def sign_in(user)
  visit new_user_session_path # wherever the login page is
  fill_in('user[email]', with: user.email)
  fill_in('user[password], with: user.password)
  click_button('Sign in') # whatever needs to be clicked to login
  assert_text('You are now logged in') # whatever message confirms the login succeeded
end
Другие вопросы по тегам