如何在渲染中引发异常

时间:2016-04-12 11:28:01

标签: elixir phoenix-framework

我的控制器中有以下异常处理程序

  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

而不是Ecto.CastError提出400我希望它引发404。但是,我无法满足以下测试条件

  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

由于我的自定义异常处理程序没有引发异常。

问题是,如何在我自己的自定义异常处理程序中引发适当的异常以满足测试?

2 个答案:

答案 0 :(得分:1)

请查看此页面,了解如何处理Phoenix中的错误:http://www.phoenixframework.org/v1.1.4/docs/custom-errors

您可以覆盖默认值(已定义here),以便Ecto.CastError产生404.

答案 1 :(得分:1)

我使用错误的方法,而不是

  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

我应该在我的控制器中使用这个块

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