Rspec / Capybara`js:true`问题

时间:2016-02-09 16:50:10

标签: ruby-on-rails ruby rspec capybara multi-tenant

我在Rails应用程序中使用Rspec / Capybara。在一个功能测试中,我有js: true选项来检查其中的模态和单击按钮。工作正常,直到我为多租户和PosgreSQL模式添加apartment gem。

现在找不到调用模态的按钮。我事件不确定它已正确记录(binding.pry无法正常使用js进行测试。 我认为这是DatabaseCleaner问题,但我的配置似乎是正确的(见下文)。

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
 end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    Apartment::Tenant.switch!
    DatabaseCleaner.start
  end

  config.append_after(:each) do
    DatabaseCleaner.clean
    Apartment::Tenant.reset
  end
end

可以提出哪些方案来解决此问题?

2 个答案:

答案 0 :(得分:1)

HereApartment的RSpec配置示例。请注意删除架构的部分。

RSpec.configure do |config|
  config.before(:suite) do
    # Clean all tables to start
    DatabaseCleaner.clean_with :truncation
    # Use transactions for tests
    DatabaseCleaner.strategy = :transaction
    # Truncating doesn't drop schemas, ensure we're clean here, app *may not* exist
    Apartment::Tenant.drop('app') rescue nil
    # Create the default tenant for our tests
    Company.create!(name: 'Influitive Corp.', subdomain: 'app')
  end

  config.before(:each) do
    # Start transaction for this test
    DatabaseCleaner.start
    # Switch into the default tenant
    Apartment::Tenant.switch! 'app'
  end

  config.after(:each) do
    # Reset tentant back to `public`
    Apartment::Tenant.reset
    # Rollback transaction
    DatabaseCleaner.clean
  end
end

此外,您可以将DatabaseCleaner配置的一部分重写为更短

config.before(:each) do |example|
  DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
  DatabaseCleaner.start
  ...
end

答案 1 :(得分:1)

找出config.block_unknown_url问题的真正原因。 问题是我的“capybara.rb”中有lvh.me。 为了测试多租户我使用config.allow_url("*.lvh.me")域名,因此我需要将js: true添加到“capybara.rb”文件中以修复损坏的#include <stdio.h> int foo(int i){return i+1;} typedef int(*mytype[2])(int); int main(void) { mytype f; f[0] = foo; f[1] = &foo; printf("%d %d", f[0](5), f[0](6)); return 0; } 内容。