2017-03-18 2 views
0

Dans mon application Phoenix je plug qui ressemble à ceci:** (ArgumentError) flash ne tiré par les cheveux, appelez fetch_flash/2

defmodule MyApp.Web.Plugs.RequireAuth do 
    import Plug.Conn 
    import Phoenix.Controller 
    import MyApp.Web.Router.Helpers 

    def init(_options) do 
    end 

    def call(conn, _options) do 
    if conn.assigns[:user] do 
     conn 
    else 
     conn 
     |> put_flash(:error, "You must be logged in") 
     |> redirect(to: project_path(conn, :index)) 
     |> halt() 
    end 
    end 
end 

je l'ai écrit des tests pour elle:

defmodule MyApp.Web.Plugs.RequireAuthTest do 
    use MyApp.Web.ConnCase 

    import MyApp.Web.Router.Helpers 

    alias MyApp.Web.Plugs.RequireAuth 
    alias MyApp.Accounts.User 

    setup do 
    conn = build_conn() 

    {:ok, conn: conn} 
    end 

    test "user is redirected when current user is not set", %{conn: conn} do 
    conn = RequireAuth.call(conn, %{}) 

    assert redirected_to(conn) == project_path(conn, :index) 
    end 

    test "user is not redirected when current user is preset", %{conn: conn} do 
    conn = conn 
    |> assign(:user, %User{}) 
    |> RequireAuth.call(%{}) 

    assert conn.status != 302 
    end 
end 

Quand je courir mes specs il me renvoie l'erreur suivante:

1) test user is redirected when current user is not set (MyApp.Web.Plugs.RequireAuthTest) 
    test/lib/web/plugs/require_auth_test.exs:15 
    ** (ArgumentError) flash not fetched, call fetch_flash/2 
    stacktrace: 
     (phoenix) lib/phoenix/controller.ex:1231: Phoenix.Controller.get_flash/1 
     (phoenix) lib/phoenix/controller.ex:1213: Phoenix.Controller.put_flash/3 
     (my_app) lib/my_app/web/plugs/require_auth.ex:14: MyApp.Web.Plugs.RequireAuth.call/2 
     test/lib/web/plugs/require_auth_test.exs:16: (test) 

Lorsque je supprime cette ligne de mon connecteur:

put_flash(:error, "You must be logged in") 

spec passent sans problèmes. Qu'est-ce que je fais mal?

Répondre

2

Votre exemple est décrit dans Programming Phoenix et la solution pour cela est de contourner la couche de routeur avec bypass_through/3 de Phoenix.ConnTest.

Utilisez quelque chose comme ça dans votre suite de tests:

setup %{conn: conn} do 
    conn = 
    conn 
    |> bypass_through(Rumbl.Router, :browser) 
    |> get("/") 
    {:ok, %{conn: conn}} 
end 

Il vous donnera Flash valide et soutien session.