2012-01-11 69 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