我正在尝试在我的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
之后执行此文件的方法。有人知道怎么做吗?
答案 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