2016-09-09 14 views
6

Pracuję poprzez samouczek phoenix ale mam ten błąd:Własność Test uruchomiony proces Phoenix błąd w eliksiru 1.3.2

** (DBConnection.OwnershipError) cannot find ownership process for #PID<0.265.0>. 

nie używam Task.start więc nic nie powinno być uruchomiony asynchronicznie, i pomyślałem, że o tryb w tagu unless byłby wystarczający, aby zapobiec występowaniu tego błędu, w test/support/channel_case.ex:

setup tags do 
    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Watchlist.Repo) 

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

    :ok 
    end 

Tak, jestem ciekaw, jak rozwiązać ten problem.

To jak go uruchomić:

mix test test/integration/listing_movies_test.exs

używam Elixir 1.3.2

UPDATE

defmodule ListingMoviesIntegrationTest do 
    use ExUnit.Case, async: true 
    use Plug.Test 
    alias Watchlist.Router 

    @opts Router.init([]) 
    test 'listing movies' do 
    movie = %Movie{name: "Back to the future", rating: 5} 
      |> Repo.insert! <== error happens here 

    conn = conn(:get, "/movies") 
    response = Router.call(conn, @opts) 

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

Pełna ślad stosu:

(db_connection) lib/db_connection.ex:718: DBConnection.checkout/2 
     (db_connection) lib/db_connection.ex:619: DBConnection.run/3 
     (db_connection) lib/db_connection.ex:463: DBConnection.prepare_execute/4 
     (ecto) lib/ecto/adapters/postgres/connection.ex:91: Ecto.Adapters.Postgres.Connection.execute/4 
     (ecto) lib/ecto/adapters/sql.ex:235: Ecto.Adapters.SQL.sql_call/6 
     (ecto) lib/ecto/adapters/sql.ex:454: Ecto.Adapters.SQL.struct/6 
     (ecto) lib/ecto/repo/schema.ex:397: Ecto.Repo.Schema.apply/4 
     (ecto) lib/ecto/repo/schema.ex:193: anonymous fn/11 in Ecto.Repo.Schema.do_insert/4 
     (ecto) lib/ecto/repo/schema.ex:124: Ecto.Repo.Schema.insert!/4 
     test/integration/listing_movies_test.exs:13: (test) 

aw test_helper który jest faktycznie nazywa się umieścić w oświadczeniu debug:

ExUnit.start 

Ecto.Adapters.SQL.Sandbox.mode(Watchlist.Repo, :manual) 
Ecto.Adapters.SQL.Sandbox.mode(Watchlist.Repo, {:shared, self()}) 
+0

Czy możesz opublikować kod z samego testu? – rozap

+0

@rozap - dodany kod –

+0

możesz pokazać nam, co masz w testowym pomocniku? Czy mógłbyś pokazać nam pełny komunikat o błędzie. – ash

Odpowiedz

4
use ExUnit.Case, async: true 
use Plug.Test 

Masz kod dla haka instalacyjnego w "test/support/channel_case.ex", ale nie używasz go w dowolnym miejscu testu lub przynajmniej nie jest jasne, czy go używasz. Byłoby pomocne, gdybyś mógł to dodać:

IO.puts "#{inspect __MODULE__}: setup is getting called." 

gdzieś w kodzie konfiguracji haka. Zapewni to, że kod rzeczywiście działa. Podejrzewam, że na podstawie komentarza z mojej poprzedniej odpowiedzi ten kod jest martwy.

defmodule ListingMoviesIntegrationTest do 
    use ExUnit.Case, async: true 
    use Plug.Test 
    alias Watchlist.Router 

    setup do 
    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Watchlist.Repo) 
    Ecto.Adapters.SQL.Sandbox.mode(Watchlist.Repo, {:shared, self()}) 
    :ok 
    end 


    @opts Router.init([]) 
    test 'listing movies' do 
    movie = %Movie{name: "Back to the future", rating: 5} 
     |> Repo.insert! <== error happens here 

    conn = conn(:get, "/movies") 
    response = Router.call(conn, @opts) 

    assert response.status == 200 
    assert response.resp_body == movie 
    end 
    ... 
+0

To nie jest wezwanie, masz rację. –

+0

Cóż, wtedy błąd nie jest zaskakujący. Musisz ustawić blok instalacyjny jako część testu integracji. Lub pozostaw piaskownicę automatycznie. – ash

+0

Jak mogę to zrobić? Dziękujemy –

0

Chyba są omijając tę ​​linię

Ecto.Adapters.SQL.Sandbox.mode(Watchlist.Repo, {:shared, self()}) 

ponieważ

iex(1)> unless true do 
...(1)> IO.puts "test" 
...(1)> end 
nil 
iex(2)> unless false do 
...(2)> IO.puts "test" 
...(2)> end 
test 
:ok 

Czy ty spróbuj:

if tags[:async] do 
    Ecto.Adapters.SQL.Sandbox.mode(Watchlist.Repo, {:shared, self()}) 
end 
+0

Rzeczywiście wypróbowałem twój kod, a następnie usunąłem kod if i end i otrzymałem ten sam błąd. Ale dziękuję. –

Powiązane problemy