我的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
。
答案 0 :(得分:1)
我也有这个问题。另外,当我试图调查它时,Ruby解释器会在某些条件下发生段错(可能是由SQLite引起的)。
我声明了一个唯一索引,如下所示:
add_index(:table, [:column1, :column2], unique: true)
将以下唯一性约束添加到模型中(除了迁移中的现有索引之外)使问题消失:
validates_uniqueness_of :column1, scope: :column2