В моих модульных тестах у меня есть приспособление, которое создает транзакцию отката, чтобы очистить базу данных после запуска моих тестов. Это выглядит примерно так:
(defn with-rollback [test-fn]
(let [db-conn (db/connect db/test-pg-db)]
(jdbc/with-db-transaction [txn db-conn {:isolation :serializable}]
(jdbc/db-set-rollback-only! txn)
(-> (mount/only [#'db/db])
(mount/swap {#'db/db txn})
(mount/start))
(test-fn)
(mount/stop))
(db/disconnect db-conn)))
Затем в тестах я делаю (use-fixtures :each fixtures/with-rollback)
.
Это отлично работает, за исключением тестов, где я хочу проверить, что условия ошибки фактически откатывают транзакции . Например, я хочу проверить, что при сбое запроса к внешней службе я ничего не записываю в базу данных.
Есть ли способ добиться поведения, аналогичного вложенным транзакциям, для моего варианта использования? У меня была идея переопределить функцию jdbc/db-transaction*
чем-то, что создает точки сохранения при открытии транзакции и откатывается к ближайшей из них при обнаружении исключения - но я так и не смог заставить ее работать. Приветствую любую помощь!