2016-06-01 4 views

Antwort

4

Ich habe meine Phoenix Authorized Controller Tests bestanden. Hier ist meine Lösung:

Test/controllers/inbox_controller_test.exs:

defmodule MyApp.InboxControllerTest do 
    use MyApp.ConnCase 
    alias MyApp.User 

    setup do 
    user = %User{id: "a1234"} 
    {:ok, jwt, full_claims} = Guardian.encode_and_sign(user) 
    {:ok, %{user: user, jwt: jwt, claims: full_claims}} 
    end 

    test "lists all entries on index", %{jwt: jwt} do 
    conn = conn() 
     |> put_req_header("authorization", "Bearer #{jwt}") 
     |> get(inbox_path(conn, :index)) 
    assert json_response(conn, 200)["inboxes"] == [] 
    end 
end 

config/test.exs:

config :guardian, Guardian, 
    serializer: MyApp.TestGuardianSerializer 

Test/support/test_guardian_serializer.ex:

defmodule MyApp.TestGuardianSerializer do 
    @behaviour Guardian.Serializer 

    alias MyApp.User 

    def for_token(user = %User{}), do: { :ok, "User:#{user.id}" } 
    def for_token(_), do: { :error, "Unknown resource type" } 

    def from_token("User:" <> id) do 
    {:ok, %User{id: id, login: "admin"}} 
    end 

    def from_token(_), do: { :error, "Unknown resource type" } 
end 
+0

Wow, danke @arkadiy das hat mir wirklich geholfen. –

4

Ich löste dies, indem ich ein Test-Tag erstellte, das den Benutzer mit Guardians sign_in-Methode erstellt und protokolliert (verwenden Sie api_sign_in wenn Guardian 0.14.x). Dann können Sie es auf die Tests anwenden, die einen angemeldeten Benutzer benötigen, etwa so:

setup %{conn: conn} = config do 
    cond do 
     config[:login] -> 
     user = insert_user() 
     signed_conn = Guardian.Plug.sign_in(conn, user) 
     {:ok, conn: signed_conn} 
     true -> 
     :ok 
    end 
    end 

    @tag :login 
    test "shows page only when logged in", %{conn: conn} do 
    conn = get(conn, some_page_path(conn, :index)) 
    assert html_response(conn, 200) 
    end 

Wenn Sie den Benutzer brauchen Sie nur für eine Behauptung erstellt haben, können Sie es zusammen mit der Verbindung übergeben:

config[:login] -> 
    user = insert_user() 
    signed_conn = Guardian.Plug.sign_in(conn, user) 
    {:ok, conn: signed_conn, user: user} 

und Muster passen es im Test:

@tag :login 
    test "shows page only when logged in", %{conn: conn, user: user} do 
    # ... 
    end 

Betrachten sie die insert_user Logik zu einem Block setup_all bewegenden Datenbankoperationen zu reduzieren und die t beschleunigen .

+0

Das gibt mir nur einen Fehler von 'Funktion Guardian.Plug.api_sign_in/2 ist undefined (Modul Users.Guardian.Plug ist nicht verfügbar)'. Sind Sie sicher, dass diese Funktion existiert? – Sebastialonso

+1

@Sebastialonso Ja, wenn Sie zu Guardian 0.14.x wechseln. Es wurde möglicherweise in Guardian 1.x entfernt oder umbenannt, was wahrscheinlich das ist, was Sie verwenden. – Svilen