2013-01-16 34 views
10

後如何刪除(在數據庫和內存)創建RSpec的:平表/銷燬對象,每個上下文

  • 每個測試
  • 和每個上下文後後的對象嗎? (在上下文中,它可以在彼此之間構建測試)

是否有一種方法可以自動執行此操作?

我有以下問題:

每個測試條目保存到數據庫中。接下來的測試取決於這些條目。即使我想構建依賴於其他測試的測試,我也無法這樣做,因爲測試執行的順序不可控。

factories.rb:

sequence(:name) { |n| "purchaser #{n}" }  

organization_spec.rb:

context "when no supplier exists" do 
    it "finds no associated suppliers" do 
    purchaser = create(:organization_purchaser)     
    purchaser.partners.empty?.should == true 
    end 
end 

context "when one supplier exists" do 
    it "finds one associated suppliers" do 
    purchaser = create(:organization_purchaser)  
    supplier = create(:organization_supplier) 
    partnership = create(:partnership, organization: purchaser, partner: supplier)   
    purchaser.partners.last.name.should == "purchaser 1" 
    end 
end 

context "when two suppliers exist" do   
    it "finds two associated suppliers" do 
    purchaser = create(:organization_purchaser)  
    2.times do |i| 
     supplier = create(:organization_supplier) 
     partnership = create(:partnership, organization: purchaser, partner: supplier) 
    end  
    purchaser.partners.last.name.should == "purchaser 2" 
    end 
end 

RSpec的輸出:

Organization 
    #suppliers_for_purchaser 
    responds 
    when no supplier exists 
     finds no associated suppliers 
    when two suppliers exist 
     finds two associated suppliers 
    when one supplier exists 
     finds one associated suppliers (FAILED - 1) 

Failures: 

1) Organization#suppliers_for_purchaser when one supplier exists finds one associated suppliers 
Failure/Error: purchaser.partners.last.name.should == "purchaser 1" 
    expected: "purchaser 1" 
     got: "purchaser 3" (using ==) 
+2

https://github.com/bmabey/database_cleaner – deefour

回答

15

您應該使用Database Cleaner

您只需添加以下c歌頌你的Rspec的配置文件spec_helper.rb

config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
end 

config.before(:each) do 
    DatabaseCleaner.start 
end 

config.after(:each) do 
    DatabaseCleaner.clean 
end 

UPDATE

鐵軌5.1的這個,如果你使用的是不需要config.use_transactional_tests

https://github.com/rails/rails/pull/19282

6

你嘗試方法之前加入?

describe MyController do 

before(:each) do 
    User.delete_all 
    MyOtherModel.delete_all 
    ... 
end 
1

我認爲你的問題更多的是如何重置工廠女孩序列?那些不存儲在數據庫中,即使你刪除所有你仍然有問題。當測試這樣的事情,我覺得它easer只覆蓋出廠女孩序列..

it "finds one associated suppliers" do 
    purchaser = create(:organization_purchaser)  
    supplier = create(:organization_supplier , name: "My First Supplier") 
    partnership = create(:partnership, organization: purchaser, partner: supplier)   
    purchaser.partners.last.name.should == "My First Supplier" 
    end 

你可能做的其他事情是一樣的東西

it "finds one associated suppliers" do 
     purchaser = create(:organization_purchaser)  
     supplier = create(:organization_supplier) 
     partnership = create(:partnership, organization: purchaser, partner: supplier)   
     purchaser.partners.last.should == supplier 
     end 

甚至

it "finds one associated suppliers" do 
     purchaser = create(:organization_purchaser)  
     supplier = create(:organization_supplier) 
     partnership = create(:partnership, organization: purchaser, partner: supplier)   
     purchaser.partners.last.name.should == supplier.name 
     end