Подтвердить что ты не робот

"Невозможно начать тестовую транзакцию, потому что мы уже внутри нее"

Я следил за этим уроком, и мой простой тест всегда терпит неудачу с этой ошибкой

1) test /index returns a list of contacts (WorldNote.ChatsControllerTest)                                             
     test/controllers/chats_controller_test.exs:16                                                                      
     ** (RuntimeError) cannot begin test transaction because we are already inside one                                  
     stacktrace:                                                                                                        
       (ecto) lib/ecto/adapters/sql.ex:321: anonymous fn/6 in Ecto.Adapters.SQL.start_test_transaction/3                
       (ecto) lib/ecto/adapters/sql.ex:615: Ecto.Adapters.SQL.pool_transaction/4                                        
       (ecto) lib/ecto/adapters/sql.ex:314: Ecto.Adapters.SQL.start_test_transaction/3                                  
       test/controllers/chats_controller_test.exs:9: WorldNote.ChatsControllerTest.__ex_unit_setup_0/1                  
       test/controllers/chats_controller_test.exs:1: WorldNote.ChatsControllerTest.__ex_unit__/2    

Код довольно прост

defmodule WorldNote.ChatsControllerTest do
  use ExUnit.Case, async: false
  use Plug.Test
  alias WorldNote.Chats
  alias WorldNote.Repo
  alias Ecto.Adapters.SQL

  setup do
    SQL.begin_test_transaction(Repo)

    on_exit fn ->
      SQL.rollback_test_transaction(Repo)
    end
  end

  test "/index returns a list of contacts" do
    contacts_as_json =
      %Chats{fbid: 1234567890, latitude: 0.0, longitude: 0.0, content: "yo"}
      |> Repo.insert
      |> List.wrap
      |> Poison.encode!

    response = conn(:get, "/api/contacts") |> send_request

    assert response.status == 200
    assert response.resp_body == contacts_as_json
  end

  defp send_request(conn) do
    conn
    |> put_private(:plug_skip_csrf_protection, true)
    |> WorldNote.Endpoint.call([])
  end
end

Я googled по всей ошибке cannot begin test transaction because we are already inside one. Но не удалось найти никаких исправлений.

PS. Im использует Postgresql

4b9b3361

Ответ 1

Используете ли вы последний Phoenix? Если это так, предполагается, что он создал test/support/conn_case.ex, у которого уже есть все шаги, необходимые для запуска тестов контроллера. Вам просто нужно сделать use YourApp.ConnCase в своих тестах. Сообщение в блоге было написано до того, как была создана тестовая инфраструктура.:)

Тем не менее, причина в том, что test/test_helper.exs уже имеет вызов begin_test_transaction.