2011-07-20 18 views
6

私は個々のrspecモデル仕様ファイルを実行するとすべての例が緑色になり、仕様/モデルフォルダ全体をテストするとすべての例が緑色になります。コントローラをテストすると、すべて緑色になります。スイート全体(rspec specを介して)をテストすると、失敗します。コントローラのテストをすべて削除すると、すべてが緑色になります。今私はこれが完全に自滅していると思っていますが、私はそれを理解できません。Rspecスイート全体のテストに失敗する

コントローラーテストで具体的な例を絞り込んだので、モデル仕様の例が失敗します。

例えば、 notes_controller_spec.rbにこの行は、それが

Failure/Error: @account.all_notes.should have(2).notes 
ArgumentError: 
comparison of Note with Note failed 
./app/models/account.rb:293:in `sort' 

ライン293はaccount_spec.rb /私のモデルでは、障害が発生し

Note.any_instance.stubs(:valid?).returns(false) 

存在する場合、

(self.notes + self.transactions.map(&:notes).flatten).sort {|a,b| a.created_at <=> b.created_at } 

私はこれらの顔の手のひらの瞬間の1つになると確信しているので、私と優しい!

+0

'created_at'は、あなたのソート・ブロックは' 'Fixnum'に対するnil'を比較することになることを意味する、'ノートのいずれかのnil'かもしれ後

describe Service, type: :model do before do end end 

ブロックが 'nil'を返すようになり、あなたが見ている種類の' ArgumentError'でソートが崩壊します。この行が実行されると、すべてのインスタンスがデータベースに保存されていますか?それぞれの例の前にあなたのデータベースが空になっていない可能性はありますか? –

+0

私も同様の問題があります。私はそれが修正されたと主張するものの、[このrspecの問題](https://github.com/rspec/rspec-mocks/issues/54)に関連している可能性があります。 –

+0

申し訳ありませんが、誤って入力しました。詳細を入力してください: モデルの任意のインスタンスでメソッドをスタブしています - 特定のテストでテストしているモデルとは異なるモデルです。そのメソッドを必要とする別のテストを実行すると、そのメソッドは見つかりません。 1つのファイルでテストでスタブを取り出すと、もう1つのファイルが通過します。本当に迷惑です。 私はさまざまなバージョンのrspecをインストールしてみました。 –

答えて

1

以前の日付設定を行っていますか:すべてのブロック?これらはトランザクションではなく、テスト汚染の問題を引き起こす可能性があります。

また、私はあなたの構文はここにオフかもしれないと思う:

Note.any_instance.stubs(:valid?).returns(false) 

は次のようになります。

Note.any_instance.stub(:valid?).and_return(false) 
0

私はRSpecの3とRails 4.1と同様の問題を経験してきました。私が問題のあるspecファイルを単独で実行したときは、それは成功しますが、フルスイートを実行すると失敗することになります。

私の場合、それは何らかの形でタイムゾーンに関連していました。私は明示的にApplicationControllerでタイムゾーンを設定していましたが、何らかの理由で私の機能仕様がそれを気に入らなかったのです。テスト環境でタイムゾーンを設定しないと、すべてが再び通過します。例えば

unless Rails.env.test? 
    Time.zone = "some timezone value here" 
end 
0

私は同様の問題を抱えていました。個々のモデル仕様が合格しました。モデルスイート全体を実行すると、約30の失敗が発生しました。私がしたことは、すべての失敗が起こる前にファイルを見ていたことでした。そこで、私はスレッド内でものを設定し、このrailscastのようなdefault_scopesを使用していることがわかりました。

前の節では、Company.current_idを印刷しました。私が思ったように、個別に実行した場合、Company.current_idnilでした。スイートを実行するとき、Company.current_id2でした。これは、既定のスコープを使用する場合に発生します。これを修正するために、前節のCompany.current_idnilに設定しました。

describe Service, type: :model do 
    before do 
    Company.current_id = nil 
    end 
end