1

我正在尝试使用-- with等Plug.Test来测试错误处理。Plug.ErrorHandlerassert conn.status == 406

我有defp handle_errors(包含一条send_resp语句),它似乎被调用了,但是,我的测试仍然失败,但仍然有同样的异常(好像handle_errors没有效果)。

对示例高级插件(不是 Phoenix)应用程序的引用也将不胜感激。

4

2 回答 2

0

尝试这样的事情(未经测试):

defmodule NotAcceptableError do
  defexception plug_status: 406, message: "not_acceptable"
end

defmodule Router do
  use Plug.Router
  use Plug.ErrorHandler

  plug :match
  plug :dispatch

  get "/hello" do
    raise NotAcceptableError
    send_resp(conn, 200, "world")
  end

  def handle_errors(conn, %{kind: _kind, reason: reason, stack: _stack}) do
    send_resp(conn, conn.status, reason.message)
  end
end

test "error" do
  conn = conn(:get, "/hello")

  assert_raise Plug.Conn.WrapperError, "** (NotAcceptableError not_acceptable)", fn ->
    Router.call(conn, [])
  end

  assert_received {:plug_conn, :sent}
  assert {406, _headers, "not_acceptable"} = sent_resp(conn)
end
于 2020-05-09T13:12:32.047 回答
0

使用assert_error_sent/2断言您引发了错误并且它被包装并以特定状态发送。匹配其{status, headers, body}返回值以断言 HTTP 响应的其余部分符合您的期望。

response = assert_error_sent 404, fn ->
  get(build_conn(), "/users/not-found")
end
assert {404, [_h | _t], "Page not found"} = response
于 2020-11-09T01:54:15.257 回答