Вложенные транзакции с использованием точек сохранения для тестов в clojure.jdb c и postgres - PullRequest
2 голосов
/ 06 августа 2020

В моих модульных тестах у меня есть приспособление, которое создает транзакцию отката, чтобы очистить базу данных после запуска моих тестов. Это выглядит примерно так:

(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* чем-то, что создает точки сохранения при открытии транзакции и откатывается к ближайшей из них при обнаружении исключения - но я так и не смог заставить ее работать. Приветствую любую помощь!

...