ruby-on-rails - 使用 Minitest-rails、Capybara、Capybara-webkit 和 Rails 4 测试数据库播种

标签 ruby-on-rails capybara minitest

我对 TDD 非常陌生,并选择使用上面提到的 Gems。我认为我已经正确设置了它,因为我可以运行我的测试。但是,我无法弄清楚如何从 db/seeds.rb 填充我的测试数据库。当我调用

rake db:seed RAILS_ENV=test

在终端中,我可以通过 PGAdmin 查看数据库中创建的行。但是,当我使用以下命令运行测试时

rake minitest:all

数据库最终变成空白,并且在测试中,当我保存屏幕截图时,数据库中的项目不会像我在开发中时那样出现在前端。

我的 test_helper.rb 包含以下内容。

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require 'minitest/rails/capybara'
require 'minitest/focus'
require 'minitest/colorize'
Capybara.javascript_driver = :webkit

class ActiveSupport::TestCase
  fixtures :all
    DatabaseCleaner.strategy = :transaction

    class MiniTest::Spec
      before :each do
            Rake::Task["db:seed"].invoke
            DatabaseCleaner.start
      end

      after :each do
            DatabaseCleaner.clean
      end
    end
end

对于一些额外的背景,我的 db/seeds.rb 文件(当使用 rake 手动播种时有效)

ProgramIndustry.delete_all
ProgramIndustry.create([
        { name: 'Accounting and finance'},
        { name: 'Banking'},
        { name: 'Construction'},
        { name: 'Education'}
])

为什么测试开始时数据库不会填充 seeds.rb?

最佳答案

您的数据库为空,因为您正在使用 DatabaseCleaner,它会从数据库中删除数据。我假设这就是您希望 test_helper.rb 文件的样子:

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require 'minitest/rails/capybara'
require 'minitest/focus'
require 'minitest/colorize'

Capybara.javascript_driver = :webkit

class ActiveSupport::TestCase
  fixtures :all

  DatabaseCleaner.strategy = :transaction

  before do
    DatabaseCleaner.start
    Rake::Task["db:seed"].invoke # seed after starting
  end

  after do
    DatabaseCleaner.clean
  end
end

我不知道如何从 before Hook 调用 db:seed 任务,这似乎有点可疑。但我不使用 DatabaseCleaner,因为我更喜欢使用固定装置和 ActiveSupport::TestCase 支持的事务。

我不知道你为什么使用 DatabaseCleaner,但是看到你在 Minitest 中使用 RSpec 语法,我假设你只是在尝试直到它们起作用。我是否可以建议删除 DatabaseCleaner 并将所有测试数据放入固定装置中,并使用以下内容来管理跨线程的数据库事务:

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require 'minitest/rails/capybara'
require 'minitest/focus'
require 'minitest/colorize'

class ActiveSupport::TestCase
  fixtures :all
end

# Capybara driver
Capybara.javascript_driver = :webkit

# Make all database transactions use the same thread
ActiveRecord::ConnectionAdapters::ConnectionPool.class_eval do
  def current_connection_id
    Thread.main.object_id
  end
end

如果您对此有疑问,请考虑以下变体:

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require 'minitest/rails/capybara'
require 'minitest/focus'
require 'minitest/colorize'

class ActiveSupport::TestCase
  fixtures :all
end

# Capybara driver
Capybara.javascript_driver = :webkit

# Make all database transactions use the same thread
class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end

ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

关于ruby-on-rails - 使用 Minitest-rails、Capybara、Capybara-webkit 和 Rails 4 测试数据库播种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19145496/

相关文章:

ruby - 用 minitest 测试鸿沟

ruby-on-rails - 在开发 Web 应用程序时,您何时会使用图形数据库与文档数据库?

css - 嵌入式 ruby​​ 中的动态 css 类

ruby-on-rails - Rails 数据/基准变形问题

ruby-on-rails - 如何检查 capybara 中的复选框?

ruby-on-rails - Rspec 和 Capybara , visit 和 get 有什么区别

ruby - 元素在点 (617, 690.5) 处不可单击。其他元素将收到点击:<th>...</th> (Selenium::WebDriver::Error::UnknownError)

ruby-on-rails - 如何使我的 Google map 叠加层更高(在 Rails 中)

ruby-on-rails - 在不使用标签 rails 的情况下引用另一个 fixture

ruby-on-rails - 默认情况下的 Minitest-Rails 规范样式测试