14

作成したオブジェクト (データベースおよびメモリ内) を削除する方法

  • 各テストの後
  • そして、各コンテキストの後?(状況によっては、相互にテストを構築することが理にかなっている可能性があります)

これを自動的に行う方法はありますか?

次の問題があります。

各テストはエントリをデータベースに保存します。次のテストは、これらのエントリに依存します。他のテストに依存するテストを作成したいと思っても、テストが実行される順序を制御できないため、作成できませんでした。

factory.rb:

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

組織仕様.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 ==)
4

3 に答える 3

16

データベースクリーナーを使用する必要があります

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

アップデート

Rails 5.1以降、これは必要ありませんconfig.use_transactional_tests

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

于 2013-01-16T20:13:54.230 に答える
8

before メソッドを追加してみましたか?

describe MyController do

before(:each) do
  User.delete_all
  MyOtherModel.delete_all
  ...
end
于 2013-01-16T19:51:21.833 に答える
1

あなたの質問は、工場の女の子のシーケンスをリセットするにはどうすればよいですか?それらはデータベースに保存されません。すべてを削除しても問題は残ります。このようなものをテストするときは、工場の女の子のシーケンスをオーバーライドする方が簡単だと思います..

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
于 2013-01-16T20:00:09.977 に答える