ruby-on-rails - 如何测试 Apartment、Minitest、Capybara 和 Selenium

标签 ruby-on-rails selenium capybara minitest apartment-gem

我是 Minitest 和 Apartment 的新手,很难正确配置环境以运行测试用例。我想使用 Capybara & Selenium 进行验收测试。当我运行测试时,我收到以下错误消息:

Apartment::TenantNotFound:         Apartment::TenantNotFound: One of the following schema(s) is invalid: "test-tenant" "public"

所以似乎没有正确创建租户。 Apartment gem 有关于如何将它与 Rspec 一起使用的说明,但我不知道如何在 Minitest 中进行类似的设置。应该如何定义租户,以便 Minitest 可以看到它们?

我的 test_helpers.rb:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
require "minitest/rails/capybara"
Minitest::Reporters.use!

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
end

class ActionController::TestCase
  include Devise::TestHelpers
end

class ActionDispatch::IntegrationTest
end

和测试用例:
require "test_helper"

class LoginTest < Capybara::Rails::TestCase
  def setup
    Apartment::Tenant.drop( "test-tenant" ) rescue nil
    Apartment::Tenant.create( "test-tenant" ) rescue nil
    Apartment::Tenant.switch!( "test-tenant" )

    # Since we are using Apartment gem, we need to tell Capybara to connect our testing tenant URL + port number
    Capybara.server_port = 5000
    Capybara.always_include_port = true
    Capybara.app_host = "http://test-tenant.lvh.me"
  end

  feature "Login" do
    scenario "with correct credentials", js: true do
      visit '/accounts/sign_in'
      fill_in("account[email]", with: "#{accounts(:tenant_user).email}")
      fill_in("account[password]", with: "password")
      click_button("Sign in")
      page.must_have_content("Signed in successfully.")

      visit '/'
      page.must_have_content("Welcome")
    end
  end

end

最佳答案

在测试了一些不同的组合后,我自己想出了答案。解决方法其实很简单。所有与 Apartment & Capybara 相关的配置都应该在 test_helpers.rb 文件中定义。

test_helpers.rb:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/reporters"
require "minitest/rails/capybara"
Minitest::Reporters.use!


Apartment::Tenant.drop( "test-tenant" ) rescue nil
Apartment::Tenant.create( "test-tenant" ) rescue nil
Apartment::Tenant.switch!( "test-tenant" )


class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all
end

class ActionController::TestCase
  include Devise::TestHelpers
end

class ActionDispatch::IntegrationTest
end

# Since we are using Apartment gem, we need to tell Capybara to connect our testing tenant URL + port number
Capybara.server_port = 5000
Capybara.always_include_port = true
Capybara.app_host = "http://test-tenant.lvh.me"

测试用例很简单:
require "test_helper"


class LoginTest < Capybara::Rails::TestCase

  def setup
  end


  feature "Login" do
    scenario "with correct credentials", js: true do
      visit '/accounts/sign_in'
      fill_in("account[email]", with: "#{accounts(:tenant_user).email}")
      fill_in("account[password]", with: "password")
      click_button("Sign in")
      page.must_have_content("Signed in successfully.")

      visit '/'
      page.must_have_content("Welcome")
    end
  end

end

关于ruby-on-rails - 如何测试 Apartment、Minitest、Capybara 和 Selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923270/

相关文章:

ruby-on-rails - 使用Google Maps时, capybara 测试在第一个测试中失败并显示Timeout::Error

ruby-on-rails - 是否有插件或 gem 可以帮助我在 rails 中执行 "invite a friend"功能?

ruby 中的 Mysql 连接查询有两个条件

java - 通过 powershell 启动 selenium grid hub 时出错 - VSTS/TFS

ruby-on-rails - Rspec 和 capybara 选择值

ruby - 如何动态地向 SitePrism 页面对象添加一个部分?

ruby-on-rails - 使用迁移将字段更改为 NOT NULL 和 NULL 字段

ruby-on-rails - Rails中的非RESTful Action

python - 如何使用 Selenium Python xpath 单击某个按钮?

selenium - 将 Selenium 2.53 升级到 3.4.0