如何在使用rspec测试之前加载seed_fu灯具?

时间:2012-01-11 21:09:54

标签: ruby-on-rails-3 rspec seed

我正在尝试在我的rails应用程序中设置rspec以进行测试。我创建了一些示例测试并执行了rake rspec --trace

在输出中,我看到此消息

** Invoke spec:models (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment 
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment 
** Execute db:schema:load

Schema被加载然后rake任务中断,因为我试图在initializers目录中的一个文件中使用数据库中的一些值。通常这些记录在数据库中,它们都存在于db / fixtures目录中的seed_fu文件中。

我正在寻找在db:schema:load之后执行此文件的方法。有人知道怎么做吗?

3 个答案:

答案 0 :(得分:4)

您可以通过简单调用SeedFu.seed来直接访问播种机。

这有利于确保种子以正确的顺序运行,如果需要,您可以传递特定夹具路径或过滤选项的参数 - 我可以看到使用对于仅测试夹具有用的特定路径,例如

这是seed-fu方法:

# Load seed data from files
# @param [Array] fixture_paths The paths to look for seed files in
# @param [Regexp] filter If given, only filenames matching this expression will be loaded
def self.seed(fixture_paths = SeedFu.fixture_paths, filter = nil)
  Runner.new(fixture_paths, filter).run
end

我不知道这种方法是否可以公开使用,但至少目前它似乎适用于我的用途。

答案 1 :(得分:1)

我提出了可接受但不理想的解决方案。我已经从initailizers文件中删除了对数据库的引用,并将其替换为简单的整数赋值。为了加载我的种子,我在spec_helper.rb

中添加了这一行
Dir[Rails.root.join("db/fixtures/*.rb")].each {|file| load file }

答案 2 :(得分:0)

你可以在开始之前在rspec测试中运行它:

`rake db:seed_fu`

`rake db:seed_fu FILTER=locales`

和测试后

`rake db:reset`

请注意魔术引号 - “

示例:

describe "POST /v1/products" do
  before(:all) do
    `rake db:seed_fu FILTER=4_locales`
  end

  after(:all) do
    `rake db:reset`
  end

  ...
end