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