• Как исправить ошибку при сохранении ActiveRecord в spec?

    @Nike0 Автор вопроса
    Проблема оказалась куда более странной - в 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.
    Ответ написан
    Комментировать