2013-01-16 10 views
10

Come si fa a cancellare gli oggetti (nel database e nella memoria) si è creatoRSpec: tavolo a filo/distruggere gli oggetti dopo ogni contesto

  • dopo ogni prova
  • e dopo ogni contesto? (in un contesto potrebbe avere senso costruire test l'uno sull'altro)

Esiste un metodo per farlo automaticamente?

Ho il seguente problema:

Ogni test salva le voci nel database. Il prossimo test dipende quindi da queste voci. Anche se volessi costruire test che dipendono da altri test, non potrei, perché l'ordine in cui i test vengono eseguiti non è controllabile.

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 uscita:

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

risposta

15

Dovresti usare Database Cleaner

Tutto quello che devi fare è aggiungere il seguente c ode al file di configurazione 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

Come di Rails 5.1 questo non è necessario se si utilizza config.use_transactional_tests

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

6

Hai provato l'aggiunta di una prima di metodo?

describe MyController do 

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

Penso che la tua domanda sia più simile a come posso ripristinare una sequenza di factory girl? Quelle non sono memorizzate nel database, anche se si cancella tutto si avrà ancora il problema. Durante il test di qualcosa come questo trovo easer di ignorare semplicemente la sequenza di fabbrica ragazza ..

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 

Le altre cose che probabilmente non è qualcosa di simile

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 

o anche

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 
Problemi correlati