Тестирование Phoenix / Elixir при настройке уровня изоляции транзакции - PullRequest
0 голосов
/ 13 января 2019

У меня есть кусок кода, который выглядит примерно так:

Repo.transaction(fn ->
  Repo.query!("set transaction isolation level serializable;")

  # do some queries

end)

В моем наборе тестов я постоянно сталкиваюсь с ошибкой:

(Postgrex.Error) ERROR 25001 (active_sql_transaction): SET TRANSACTION ISOLATION LEVEL must be called before any query

Мне интересно, делаю ли я что-то в корне неправильно или что-то в тестовой среде мне не хватает.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 августа 2019

Не уверен, что вы все еще ищете ответ на этот вопрос, но я нашел хорошее решение для этого. Для случая у меня есть блок настройки, например:

setup tags do
  :ok =
    if tags[:isolation] do
      Sandbox.checkout(Repo, isolation: tags[:isolation])
    else
      Sandbox.checkout(Repo)
    end

    unless tags[:async] do
      Sandbox.mode(Repo, {:shared, self()})
    end

    :ok
  end

затем в тесте, который находится в пути сериализуемой транзакции, вы должны пометить его как «serializable» следующим образом:

@tag isolation: "serializable"
test "my test" do
  ...
end

это позволит вам запускать ваши тесты, которые встречаются в пути с сериализуемыми и все еще используют песочницу.

0 голосов
/ 13 января 2019

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

Вы можете обойти это, но это, опять же, загрязнит вашу тестовую базу данных, и вам придется очистить ее самостоятельно:

setup do 
  [Other set up stuff]
  Ecto.Adapters.SQL.Sandbox.checkin(MyApp.Repo) #This closes any open transaction, effectively.
  Ecto.Adapters.SQL.Sandbox.checkout(MyApp.Repo, [sandbox: false]) # This opens a new transaction without sandboxing. 
end

Эта задача установки входит в тестовый файл с вашими неудачными тестами, если у вас нет настройки. Если вы не сделаете вызов checkin, вы (скорее всего) получите ошибку о других запросах, выполняемых до того, как вы задали уровень транзакции, потому что вы вставляете что-то перед тестом.

См. здесь , где кто-то, по сути, вызывает ту же проблему.

...