Проблема оказалась куда более странной - в
spec_helper.rb прописана следующая конструкция:
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
Видимо, после роллбека одного it'a сбрасывалось состояние объекта, хранящееся в @new_record (переменная ActiveRecord) и он считался новым, что и вызывало ошибку.
UPD. Перед всеми it'ами в блоке
before :all (который не входит в транзакцию), создается запись и сохраняется в БД. В каждом из тест кейсов мы эту запись обновляли и сохраняли. После завершения блока все сохранные данные откатывались, включая состояние объекта (новый или нет), хотя запись в БД осталась, из-за чего в будущем возникает ошибка с PRIMARY KEY.
Фикс оказался довольно простым - транзакции оставил включенными в
spec_helper.rb, но теперь по-другому оперировал с объектом, без его непосредственного сохранения (мы изменили какие-то поля, они сохранились в памяти, но в следующих тест кейсах мы продолжаем работать с не измененной записью).
Также был протестировано обновление записи через
update_column.