【问题标题】:Capybara failing with ionic appCapybara 使用离子应用程序失败
【发布时间】:2016-08-02 02:50:45
【问题描述】:

我正在一个 Ionic 应用程序上使用 Capybara 进行集成测试,该应用程序在后端使用 rails,我在成功登录后遇到问题,第二个 visit 什么也没做,我有一个 timeout while waiting for angular

# test_helper.rb
Dir[Rails.root.join("test/helpers/**/*.rb")].each { |f| require f }
require 'capybara/rails'
require 'capybara/poltergeist'

if ENV['VIEW_IN_BROWSER'] == "true"
  Capybara.register_driver :selenium do |app|
    Capybara::Selenium::Driver.new(app, :browser => :firefox)
  end
else
  Capybara.javascript_driver = :poltergeist
end

Capybara.server_port = 3000 # serveur rails en mode test
Capybara.always_include_port = true
Capybara.default_max_wait_time = 5
Capybara.raise_server_errors = false

class ActionDispatch::IntegrationTest
  # Make the Capybara DSL available in all integration tests
  include Capybara::DSL
  include Capybara::Angular::DSL

  def setup
    super
  end

  def teardown
    super
    Capybara.reset_sessions!
    Capybara.use_default_driver
  end
end

我的助手:

#test/helpers/ionic_helper.rb
module IonicHelper
  include Warden::Test::Helpers
  Warden.test_mode!

  def on_ionic_app
    Capybara.app_host = 'http://localhost:5000' # Serveur ionic
    begin
      yield
    rescue => error
      puts error
    ensure
      Capybara.app_host = 'http://localhost:4321' # serveur ionic en mode intégration continue
    end
  end

  def user_log_in
    user = FactoryGirl.create(:user)
    visit(Capybara.app_host+"/#/app/signin")
    fill_in "email", with: user.email
    fill_in "password", with: user.password
    click_on "Connexion"
  end
end

第一个问题是我必须将Capybara.app_host 指定给visit 方法才能访问良好的离子端口(5000),我不知道为什么。

我的第二个问题是这个测试:

# reseau_test.rb
require "test_helper"

class ReseauTest < ActionDispatch::IntegrationTest
  include IonicHelper

  test "On s'assure que tous les elements en mode connecté soient présents" do
    Capybara.current_driver = Capybara.javascript_driver

    on_ionic_app do
      user_log_in
      visit(Capybara.app_host+"/#/app/network")
      assert page.has_css?('span.count.following.text-center.ng-binding'), "Il doit y avoir un chiffre pour le nombre d'abonnements"
      assert page.has_content?('Abonnements'), "Il doit y avoir le texte 'Abonnements'"
      assert page.has_css?('span.count.follower.ng-binding'), "Il doit y avoir un chiffre pour le nombre d'abonnés"
      assert page.has_content?('Abonnés'), "Il doit y avoir le texte 'Abonnés'"
    end 
  end

end

如果我删除user_log_in,测试工作正常,但此页面必须由登录用户查看,当我测试它时,它会因timeout while waiting for angular 而失败。我可以将Capybara.default_max_wait_time 设置为 30,但同样失败。

【问题讨论】:

  • 你的第二个问题是否同时出现在 selenium 和 poltergeist 上?如果是这样 - selenium 在浏览器中显示的内容。
  • 是的,两者都存在问题。使用 selenium,浏览器只显示良好的重定向页面(登录后),不要转到第二次访问链接,等待(取决于 default_max_wait_time)并退出。
  • 用第二部分更新了我的答案

标签: ionic-framework capybara


【解决方案1】:

第一个问题:您遇到 app_host 问题的原因是您指定了 Capybara.always_include_port = true。这样做是强制将要访问的端口设置为 Capybara 正在运行服务器的端口,除非传递给 visit 的地址指定了非默认端口。由于您似乎不希望 visit 直接连接到 Capybara 运行的服务器,您应该设置删除它或将其设置为 Capybara.always_include_port = false。如果设置为 false,您可以根据需要设置 Capybara.app_host,它应该用作 visit 的默认启动

您的第二个问题是由页面中运行的 JS capybara-angular 引起的,该页面从未显示为准备就绪。检查您的 JS 中可能阻止 capybara-angular 出现问题的错误,或查看 https://github.com/wrozka/capybara-angular/issues/20

【讨论】:

    猜你喜欢
    • 2016-01-27
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多