2016-04-12 6 views
1

J'ai ce gestionnaire d'exception suivante dans mon contrôleurComment soulever une exception en rendre

def call(conn, opts) do 
    try do 
     super(conn, opts) 
    rescue 
     e in Ecto.CastError -> conn 
     |> put_status(:not_found) 
     |> render(ErrorView, "404.html") 

     e in ArgumentError -> conn 
     |> put_status(:not_found) 
     |> render(ErrorView, "404.html") 
    end 
    end 

Au lieu de Ecto.CastError pour élever une 400 que je veux soulever 404. Cependant, je ne peux pas répondre à ma condition de test suivant

test "renders page not found when id is not all number", %{conn: conn} do 
    assert_error_sent 404, fn -> 
     get conn, url_path(conn, :show, "sdf2sd") 
    end 
    end 

Depuis mon gestionnaire d'exception personnalisée n'a pas soulevé une exception.

La question est, comment soulever une exception appropriée dans mon propre gestionnaire d'exception personnalisée pour satisfaire le test?

Répondre

1

I « utilise une mauvaise approche, plutôt que

def call(conn, opts) do 
    try do 
     super(conn, opts) 
    rescue 
     e in Ecto.CastError -> conn 
     |> put_status(:not_found) 
     |> render(ErrorView, "404.html") 

     e in ArgumentError -> conn 
     |> put_status(:not_found) 
     |> render(ErrorView, "404.html") 
    end 
    end 

Je devrais utiliser ce bloc dans mon contrôleur

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

Jetez un oeil à cette page sur la façon de gérer les erreurs à Phoenix: http://www.phoenixframework.org/v1.1.4/docs/custom-errors

Vous pouvez être en mesure de remplacer les valeurs par défaut (définis here) afin que les résultats de Ecto.CastError dans un 404.

+0

Merci, m'a aidé à trouver où je me trompe. Bien que pour répondre à ma question, cet indice ne suffit pas :) – ardhitama