我正尝试使用Rails 2.3.4+中的新标准种子数据加载方法,即db:seed
rake任务。
我正在加载必须的常量数据,以使我的应用程序能够正常运行。
如何在测试之前让db:seed
任务运行,以便数据预填充?
我正尝试使用Rails 2.3.4+中的新标准种子数据加载方法,即db:seed
rake任务。
我正在加载必须的常量数据,以使我的应用程序能够正常运行。
如何在测试之前让db:seed
任务运行,以便数据预填充?
db:seed
rake 任务主要只是加载 db/seeds.rb
脚本。因此,只需执行该文件即可加载数据。
load "#{Rails.root}/db/seeds.rb"
# or
Rails.application.load_seed
放置的位置取决于您使用的测试框架以及是否希望在每次测试之前加载它或仅在开始时加载一次。您可以将其放在setup
调用中或者在test_helper.rb
文件中。
我认为应该是这样
namespace :db do
namespace :test do
task :prepare => :environment do
Rake::Task["db:seed"].invoke
end
end
end
由于config.active_record.schema_format = :sql,因此如果你设置了该选项,db:test:load 不会被执行(但是 db:test:clone_structure 会被执行)。
--trace
参数运行rake命令帮助我理解了它的工作原理。 - Jared Becktask 'db:test:prepare' => 'db:seed'
- Carson ReinkeRake::Task["db:seed"].invoke
前添加 ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])
。 - janic_db:seed
时,环境通常是 development
......非常奇怪。 - denishaskin我认为Steve's comment是正确答案。你可以使用Rails.application.load_seed
将种子数据加载到测试环境中。然而,何时以及多久加载此数据取决于一些因素:
没有方便的方法在所有测试之前运行此文件(请参见this Github issue)。您需要在每个测试之前加载数据,很可能是在测试文件的设置方法中:
# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase
def setup
Rails.application.load_seed
end
# tests here...
end
使用 RSpec 的 before(:all)
方法为此模型的所有测试加载种子数据:
describe MyModel do
before(:all) do
Rails.application.load_seed
end
describe "my model..." do
# your tests here
end
before(:suite)
中调用它而不是 before(:all)
。发布了一个单独的答案来包括格式化代码。 - Mark Schneidertest_helper.rb
中会导致种子文件被多次运行,可能会因为重复键而产生错误。 - johnpitchko在 lib/tasks/test_seed.rake 中放置以下内容,应该会在 db:test:load 之后调用种子任务:
namespace :db do
namespace :test do
task :load => :environment do
Rake::Task["db:seed"].invoke
end
end
end
在Matt的回答基础上,如果采用这种方式,我建议在rspec_helper.rb
中的before(:suite)
块中调用Rails.application.load_seed
,而不是在任何文件中的before(:all)
块中。这样,播种代码仅会为整个测试套件调用一次,而不是为每组测试调用一次。
rspec_helper.rb
:
RSpec.configure do |config|
...
config.before(:suite) do
Rails.application.load_seed
end
...
end
对于使用种子库的用户,它会改变种子的加载方式,所以您可能不能/不想使用这里提供的load ...
解决方案。
而只是将Rake::Task['db:seed'].invoke
放入test_helper中会导致以下结果:
Don't know how to build task 'db:seed' (RuntimeError)
MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
Rake::Task["db:seed"].invoke
。这样,种子数据只会在整个测试运行期间加载一次,而不是每个测试类都加载一次。在db:test:prepare
rake task中添加Rake::Task["db:seed"].invoke
对我没有用。如果我使用rake db:test:prepare
来准备数据库,然后在测试环境下进入控制台,我的所有种子数据都会出现。但是,这些种子数据在我的测试之间没有持久化。
不过,在我的设置方法中添加load "#{Rails.root}/db/seeds.rb"
就可以正常工作。
我希望能够自动加载和持久化这些种子数据,但我还没有找到合适的方法!
test_helper.rb
中并没有起作用,不过 https://dev59.com/R3I_5IYBdhLWcg3wAd82#1998520 这个链接里的方法可行。 - Daniel X MooreRails.application.load_seed
放在我的 rails_helper 文件中的require 'rspec/rails'
正下方。如果您正在使用 database_cleaner gem,则需要进行一些调整,以确保您不会在每个测试后丢失种子数据,您可以在 gem 的文档中找到相关信息。 - MageeWorldrequire 'rails/test_help'
行后添加了以下内容到test/test_helper.rb
文件中。 - Andrew