繁体   English   中英

使用Minitest-rails,Capybara,Capybara-webkit和Rails 4测试数据库种子

[英]Test database seeding with Minitest-rails, Capybara, Capybara-webkit and Rails 4

我对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钩子调用db:seed任务,这似乎有点怀疑。 但是我不使用DatabaseCleaner,因为我更喜欢使用Fixture和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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM