2015-06-03 1 views
12

Я последовал this tutorial и мой простой тест всегда терпит неудачу с этой ошибкой«Невозможно начать тестовую транзакцию, потому что мы уже внутри одного»

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 

Я гуглом во всем ошибка cannot begin test transaction because we are already inside one. Но ничего не найдено.

PS. Im using Postgresql

+0

Каково было ваше решение по этой проблеме? Я только что обновил с Phoenix_Ecto 0,3 до 0,4, и теперь я получаю эту проблему при каждом тестировании :(- даже в моем тестовом модуле, который не использует контроллеры. – TheStoneFox

+0

Как @JoseValim. Удалите всю часть с тестовыми транзакциями. ExUnit делает это автоматически с некоторого обновления –

ответ

19

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

Это говорит о причине, потому что test/test_helper.exs уже звонил begin_test_transaction.

+0

Yup. Как всегда, вы были первым Хосе. Спасибо большое: D –

+0

замечательный, менее шаблонный за тест –