2012-01-11 40 views
1

我想在我的rails应用程序中设置rspec进行测试。我创建了一些样本测试并执行rake rspec --trace如何在rspec测试之前加载seed_fu灯具?

在输出我看到这个消息

** 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 

模式被加载,然后耙任务休息,因为我想在初始化目录中的文件的一个使用一些值从数据库。通常这些记录在数据库中,它们都存在于db/fixtures目录下的seed_fu文件中。

我正在寻找一种方法来执行db:schema:load后这个文件。有人知道如何去做?

回答

3

看样子你可以直接用一个简单的调用SeedFu.seed访问播种机。

这样做的好处是确保种子以正确的顺序运行,如果需要,您可以传递特定夹具路径或过滤选项的参数 - 我可以看到使用特定路径对测试专用灯具有用,实例。

这里的种子福方法:

# 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 

我不知道,如果这种方法意味着要公开使用,但至少现在它似乎也对我的工作用途。

+0

我还应该提到,SeedFu.seed调用在before(:suite)调用中有意义,以最大化种子的值,同时最小化数据库流量。 – Nerdmaster 2012-01-31 01:52:10

0

我想出了可接受但并不理想的解决方案。我已经从initailizers文件中删除了对数据库的引用,并用简单的整数赋值取代了它。要载入我的种子我加入这行spec_helper.rb

Dir[Rails.root.join("db/fixtures/*.rb")].each {|file| load file } 
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