2011-10-10 6 views
0

私のRspecテストスイートに奇妙な問題があります。ユニーク制約を持つテーブルにデータを挿入するすべてのテストが失敗します。行番号を指定して失敗したテストを個別に実行すると、期待どおりに動作します。rspec実行時に空のテーブルでSQLite制約の例外が発生する

問題を調査するために、制約例外の原因となっているデータを挿入する前にそのテーブルの行数を表示し、テーブルが空であることを報告します。

いずれのファイルにもbefore :allはありません。

私はDatabaseCleanerを使用していますが、この問題を除いて、クリーニングが動作しているようです。

describe User 

    # ... 

    describe '#follow_location' do 
    let(:user) { Factory(:user) } 
    let(:location) { Factory(:location) } 

    it 'should raise when trying to follow an already followed location' do 
     puts LocationFollowship.count # => 0 
     user.followed_locations << location # exception raised 
     lambda { 
     user.follow_location location 
     }.should raise_error User::AlreadyFollowingLocation 
    end 
    end 

    # … 

end 

EDIT: 私はそれを追跡することができたファイル全体を実行しているときは動作しません。キャッシュされたステートメントを使用するRailsと関係しています。 ActiveRecord::Base.connection.clear_cache!を呼び出すと動作します。しかし、このスニペットをspec_helper.rbに追加すると、SQLite例外cannot use a closed statementが発生します。

+0

表示するコードはありますか? :) – corroded

+0

あなたは行く;) – fphilipe

+0

あなたは私たちにあなたの工場を示すことができますか? :)多分あなたはidフィールドを追加しました – corroded

答えて

1

この問題もありました。さらに、Rubyインタプリタは、特定の条件の下でそれを調べようとしたときにセグメンテーションを起こします(おそらくSQLiteによって引き起こされます)。

私はユニークなインデックスがそうのように、宣言している:(移行中の既存のインデックスに加えて)モデルに、次の一意性制約を追加する

add_index(:table, [:column1, :column2], unique: true) 

は問題が離れて行かせた。

validates_uniqueness_of :column1, scope: :column2 
関連する問題