2017-09-05 2 views
1

J'ai un contrôleur qui ressemble à ceci:Phoenix: contrôleur API obtient erreur quel que soit params

defmodule PrefectWeb.DocumentController do 
    use PrefectWeb, :controller 

    alias Prefect.Queue 

    def create(conn, params) do 
    case Prefect.add(Queue, struct(Prefect.Document, params[:id])) do 
     nil -> conn 
     |> put_status(404) 
     |> render("error.json") 
     status -> {:ok, status} 
    end 
    end 
end 

La méthode de création est censé ajouter le params[:id] au processus Queue. Mon test unitaire ressemble à ceci:

defmodule PrefectWeb.DocumentControllerTest do 
    use ExUnit.Case, async: true 
    use PrefectWeb.ConnCase 

    setup do 
    params = [ 
     env: "test", 
     id: 1, 
    ] 

    [params: params] 
    end 

    test "creation", %{conn: conn, params: params} do 
    conn 
    |> post(document_path(conn, :create, params)) 

    assert json_response(conn, 422) 
    end 
end 

Ce rendement spec cette erreur:

1) test creation (PrefectWeb.DocumentControllerTest) 
    test/prefect_web/controllers/document_controller_test.exs:27 
    ** (Protocol.UndefinedError) protocol Enumerable not implemented for nil. This protocol is implemented for: Date.Range, File.Stream, Function, GenEvent.Stream, HashDict, HashSet, IO.Stream, List, Map, MapSet, Range, Stream 

Si je change la fonction de contrôleur à son:

def create(conn, %{"params" => params}) do 
    ... 
end 

Je reçois cette erreur:

1) test creation (PrefectWeb.DocumentControllerTest) 
    test/prefect_web/controllers/document_controller_test.exs:27 
    ** (Phoenix.ActionClauseError) could not find a matching PrefectWeb.DocumentController.create clause 
    to process request. This typically happens when there is a 
    parameter mismatch but may also happen when any of the other 
    action arguments do not match. The request parameters are: 

     %{"env" => "test", "id" => "1"} 

Pourquoi je ne peux pas réussir le params[:id] à la méthode de création correctement?

Mise à jour

Ajout d'en-têtes de demande ne permet pas non plus:

|> put_req_header("content-type", "application/json") 

Répondre

1

La carte params est une chaîne et non une base atomique. Essayez de changer votre contrôleur à

defmodule PrefectWeb.DocumentController do 
    use PrefectWeb, :controller 

    alias Prefect.Queue 

    def create(conn, params) do 
    case Prefect.add(Queue, struct(Prefect.Document, params["id"])) do 
     nil -> conn 
     |> put_status(404) 
     |> render("error.json") 
     status -> {:ok, status} 
    end 
    end 
end 

et votre test à

defmodule PrefectWeb.DocumentControllerTest do 
    use ExUnit.Case, async: true 
    use PrefectWeb.ConnCase 

    setup do 
    params = %{ 
     "env" => "test", 
     "id" => 1 
    } 

    [params: params] 
    end 

    test "creation", %{conn: conn, params: params} do 
    conn 
    |> post(document_path(conn, :create, params)) 

    assert json_response(conn, 422) 
    end 
end 
+1

Ah! Je vous remercie. C'était plus qu'un peu confus, ha. –

0

Vous affirmez sur la conn créée en setup, au lieu de celui qui est retourné de post. Essayez de relier le conn avant l'affirmation.

test "creation", %{conn: conn, params: params} do 
    conn = 
     conn 
     |> post(document_path(conn, :create), params) 

    assert json_response(conn, 422) 
    end 
+0

Cela rend l'erreur '** protocole (Protocol.UndefinedError) Enumerable pas mis en œuvre pour nil.'. –

+0

Remarqué un autre problème, réponse éditée. –

+0

Ah, bonne prise, mais cela nous amène à l'autre erreur que je souffrais à l'origine. –