运行rspec时空表上的SQLite约束异常

时间:2011-10-10 08:56:51

标签: ruby-on-rails ruby-on-rails-3 sqlite rspec

我的Rspec测试套件遇到了一个奇怪的问题。将数据插入具有唯一约束的表的所有测试都会失败。通过指定行号单独运行失败的测试按预期工作。

要调查此问题,我在插入导致约束异常的数据之前打印了该表中的行数,并报告该表为空。

任何文件都没有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

1 个答案:

答案 0 :(得分:1)

我也有这个问题。另外,当我试图调查它时,Ruby解释器会在某些条件下发生段错(可能是由SQLite引起的)。

我声明了一个唯一索引,如下所示:

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

将以下唯一性约束添加到模型中(除了迁移中的现有索引之外)使问题消失:

validates_uniqueness_of :column1, scope: :column2