2015-06-03 14 views
12

Śledziłem this tutorial i mój prosty test zawsze niepowodzeniem z tego błędu„Nie można rozpocząć transakcji testowej, bo jesteśmy już w środku jednego”

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  

Kod jest dość prosta

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 

google całego błąd cannot begin test transaction because we are already inside one. Ale nie mogłem znaleźć żadnej poprawki.

PS. Korzystam z Postgresql

+0

Jaka była Twoja poprawka dla tego problemu? Właśnie zaktualizowałem Phoenix_Ecto 0.3 do 0.4, a teraz otrzymuję ten problem przy każdym teście :(- nawet w moim teście modelu, który nie używa kontrolerów – TheStoneFox

+0

Jak powiedział @JoseValim. Usuń całą część z transakcjami testowymi. ExUnit robi to automatycznie od czasu aktualizacji –

Odpowiedz

19

Czy korzystasz z najnowszego oprogramowania Phoenix? Jeśli tak, powinien wygenerować test/support/conn_case.ex, która ma już wszystkie kroki wymagane do uruchomienia testów kontrolera. Musisz tylko wykonać use YourApp.ConnCase w swoich testach. Post na blogu został napisany przed zainstalowaniem infrastruktury testowej. :)

To powiedziawszy, powodem jest prawdopodobnie to, że test/test_helper.exs ma już połączenie z numerem begin_test_transaction.

+0

Yup. Jak zawsze byłeś pierwszy Jose. Wielkie dzięki: D –

+0

Wspaniałe, mniej bojowe za test –