2015-05-29 7 views
12

im pisanie aplikacji phoenix ekto i mieć następujący fragment w teścieKonfigurowanie odpowiedź niestandardową wyjątku w Phoenix Application

{:ok, data} = Poison.encode(%{email: "[email protected]", password: "mypass"}) 

conn() 
|> put_req_header("content-type", "application/json") 
|> put_req_header("accept", "application/json") 
|> post(session_path(@endpoint, :create), data) 
> json_response(:not_found) == %{} 

to rzuca Ecto.NoResultsError

mam ten zdefiniowany

defimpl Plug.Exception, for: Ecto.NoResultsError do 
    def status(_exception), do: 404 
end 

ale test wciąż rzuca Ecto.NoResultsError, Jakieś wskazówki?

Odpowiedz

13

Rozważmy, jak to działa na środowisko.

  • W :prod, domyślnie jest do renderowania stron błędów, więc powinieneś zobaczyć stronę świadczonych przez YourApp.ErrorView z kodem stanu;

  • Domyślnym ustawieniem jest wyświetlanie stron debugowania, ponieważ większość razy wystąpił błąd podczas budowania kodu. Jeśli chcesz zobaczyć faktycznie renderowaną stronę błędu, musisz ustawić debug_errors: false w swoim config/dev.exs;

  • W wersji :test działa podobnie do produkcji, ale ponieważ wywołujesz aplikację z testu, test również ulegnie awarii, jeśli aplikacja ulegnie awarii. Jesteśmy poprawę ten temat przyszłych wersjach, gdzie powinieneś być w stanie napisać coś takiego:

    assert_raise Ecto.NoResultsError, fn -> 
        get conn, "/foo" 
    end 
    {status, headers, body} = sent_response(conn) 
    assert status == 404 
    assert body =~ "oops" 
    
+0

hi @ Jose-Valim postęp na ten jeden? Czy jest teraz możliwe, aby potwierdzić status bez użycia assert_raise? dzięki! – Zipme

+0

Zostało poprawione, patrz odpowiedź od 'Leo Nikkilä'. –

7

Phoenix 1.1.0 wprowadzono Phoenix.ConnTest.assert_error_sent/2 do testowania podobnych przypadków łatwiejsze.

Od the documentation:

twierdzi błąd został zapakowany i wysłany z danego stanu.

Przydatny do testowania działań, które zgodnie z oczekiwaniami wywołują błąd i mają zapakowane odpowiedzi w statusie HTTP, z treścią zwykle renderowaną przez użytkownika MyApp.ErrorView.

Przykład użycia:

assert_error_sent :not_found, fn -> 
    get conn(), "https://stackoverflow.com/users/not-found" 
end 

response = assert_error_sent 404, fn -> 
    get conn(), "https://stackoverflow.com/users/not-found" 
end 
assert {404, [_h | _t], "Page not found"} = response 
Powiązane problemy