2013-01-16 30 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