2011-10-10 55 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 

編輯: 我能夠追查。它必須使用緩存語句來處理Rails。調用ActiveRecord::Base.connection.clear_cache!使它工作。但是,在spec_helper.rb中添加此片段會導致SQLite異常cannot use a closed statement

+0

要顯示的任何代碼? :) – corroded

+0

你去了;) – fphilipe

+0

你能告訴我們你的工廠嗎? :)也許你添加了一個ID字段 – corroded

回答

1

我也有這個問題。另外,當我試圖調查它時(可能是由SQLite引起的),Ruby解釋器會在某些條件下發生段錯誤。

我有一個唯一索引中聲明,就像這樣:

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

添加下面的唯一性約束的模型(除了在遷移現有的指數)提出的問題消失:

validates_uniqueness_of :column1, scope: :column2