【问题标题】:Capybara+Selemium: How to initialize database in an integration test code and make it visible in Rails application?Capybara+Selenium:如何在集成测试代码中初始化数据库并使其在 Rails 应用程序中可见?
【发布时间】:2011-07-22 23:10:27
【问题描述】:

配置: 使用 RSpec、Capybara、Selemium 驱动程序、SQLite 数据库对 Rails 项目进行集成测试。

情况: 我对 Capybara 和默认 rack_test 驱动程序的集成测试很少。他们直接在数据库中创建用户注册(用于 Devise gem)。然后他们像用户一样使用 Capybara DSL 登录并测试场景。

问题: 我也尝试将驱动程序更改为 Selenium 以测试 JavaScript 代码。现在测试失败了,因为应用程序看不到测试创建的用户注册。

调查: 看起来 Selenium 驱动程序与事务的工作方式不同,因此在测试中所做的更改在 Web 应用程序中是不可见的。可能的解决方案包括:

config.use_transactional_fixtures = false 
DatabaseCleaner.strategy = :truncation

【问题讨论】:

    标签: ruby-on-rails database transactions selenium capybara


    【解决方案1】:

    对我来说,herehere 的解决方案:

    • 添加到 Gemfile gem database_cleaner
    • 用内容创建文件spec/support/javascript.rb

    `

    RSpec.configure do |config|
    
      config.before(:suite) do
        DatabaseCleaner.strategy = :transaction
        DatabaseCleaner.clean_with :truncation
      end
    
      config.before(:each) do
        if example.metadata[:js]
          Capybara.current_driver = :selenium
          DatabaseCleaner.strategy = :truncation
        else
          DatabaseCleaner.strategy = :transaction
          DatabaseCleaner.start
        end
      end
    
      config.after(:each) do
        Capybara.use_default_driver if example.metadata[:js]
        DatabaseCleaner.clean
      end
    end
    

    `

    虽然它对我的控制器和模型规格执行时间(从 40 到 43 秒)造成了小的损失。

    【讨论】:

    • 对我不起作用 "'example' 在示例中不可用(例如,'it' 块或在示例范围内运行的构造(例如 before、let 等) . 它仅适用于示例组(例如描述或上下文块)”。Capybara 2.6.2、Rspec 3.4.0、Rails 4.2.1
    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多