2016-04-23 20 views
1

Ich bin neu bei Elixir und Phoenix und ich versuche, einen Web-Service zu meiner Website zu ergänzen. Zunächst möchte ich meine neue Datenstruktur testen, indem ich einige Daten aus einer JSON-Datei importiere. Ich dachte, ich würde das mit einem Test machen. Ich habe die grundlegenden Handbücher gelesen (einschließlich des Testabschnitts), aber ich konnte nichts finden, um einen API-Anruf zu testen.Testen einer API Anruf mit Elixir/Phoenix

Aus dem folgenden Code, erhalte ich die folgende Fehlermeldung, wenn ich mix test laufen:

** (ArgumentError) flash not fetched, call fetch_flash/2 

Diese auf der Linie versagt, die den Anruf und gibt die Verbindung macht. Ich nehme an, dass ich den falschen Anruf verwende/etwas verpasse? Gibt es Unterlagen, die ich vermisst habe, oder kann mir jemand ein gutes Beispiel geben?

Hier ist ein Ausschnitt aus meinem router.ex:

scope "/", ContactsApp do 
    pipe_through :browser # Use the default browser stack 

    get "/", PageController, :index 
    resources "/contacts", ContactsController 
    end 

    # Other scopes may use custom stacks. 
    scope "/api", ContactsApp do 
    pipe_through :api 

    get "/import", ContactsController, :import 
    end 

Für Vorerst alles, was ich getan habe, ist die ContactsController.Create Methode kopieren und nannte es ContactsController.Import. Ich kopierte auch die „Ressource erstellt und leitet, wenn die Daten gültig“ Test und verwenden :import statt :create

Hier ist der vollständige Stack-Trace:

** (ArgumentError) flash not fetched, call fetch_flash/2 
stacktrace: 
    (phoenix) lib/phoenix/controller.ex:997: Phoenix.Controller.get_flash/1 
    (phoenix) lib/phoenix/controller.ex:982: Phoenix.Controller.put_flash/3 
    (contacts_app) web/controllers/contacts_controller.ex:74: ContactsApp.LogController.stuff/2 
    (contacts_app) web/controllers/contacts_controller.ex:1: ContactsApp.LogController.action/2 
    (contacts_app) web/controllers/contacts_controller.ex:1: ContactsApp.LogController.phoenix_controller_pipeline/2 
    (contacts_app) lib/phoenix/router.ex:261: ContactsApp.Router.dispatch/2 
    (contacts_app) web/router.ex:1: ContactsApp.Router.do_call/2 
    (contacts_app) lib/contacts_app/endpoint.ex:1: ContactsApp.Endpoint.phoenix_pipeline/1 
    (contacts_app) lib/phoenix/endpoint/render_errors.ex:34: ContactsApp.Endpoint.call/2 
    (phoenix) lib/phoenix/test/conn_test.ex:194: Phoenix.ConnTest.dispatch/5 
    test/controllers/contacts_controller_test.exs:69 
+0

Nennen Sie 'get_flash' irgendwo in Ihrem Code oder Test? – Dogbert

+0

Anscheinend 'conn = conn bekommen, contacts_path (conn,: importieren), log: @ valid_attrs' tut – Mitkins

+1

Haben Sie den Befehl' mix phoenix.gen.json' versucht? Es wird Tests für Sie generieren. So können Sie sehen, wie es gemacht wird. – sobolevn

Antwort

1

Dank @Dogbert und @sobolevn Ich konnte Figur aus was ich falsch gemacht habe. Wenn Code von mix phoenix.gen.html erzeugt wird, dann kann die Steuerung etwas wie folgt aus:

def create(conn, %{"contact" => contact_params}) do 
    changeset = Contact.changeset(%Contact{}, contact_params) 

    case Repo.insert(changeset) do 
    {:ok, _contact} -> 
     conn 
     |> put_flash(:info, "Contact created successfully.") 
     |> redirect(to: contact_path(conn, :index)) 
    {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
end 

Wenn Code von mix phoenix.gen.json erzeugt wird, dann wird der Controller etwas anderen Code enthält:

def create(conn, %{"fred" => fred_params}) do 
    changeset = Fred.changeset(%Fred{}, fred_params) 

    case Repo.insert(changeset) do 
    {:ok, fred} -> 
     conn 
     |> put_status(:created) 
     |> put_resp_header("location", fred_path(conn, :show, fred)) 
     |> render("show.json", fred: fred) 
    {:error, changeset} -> 
     conn 
     |> put_status(:unprocessable_entity) 
     |> render(ContactsApp.ChangesetView, "error.json", changeset: changeset) 
    end 
end 

Im Code I Kopieren und Einfügen gibt es einen Aufruf an put_flash als @Dogbert schlägt vor (die mit der Pipeline :browser arbeiten soll). Die Verwendung des mit mix phoenix.gen.json generierten Codes behebt das Problem.