在Phoenix Application中为异常设置自定义响应

时间:2015-05-29 18:49:54

标签: elixir phoenix-framework ecto

我用ecto编写凤凰应用程序,并在测试中有以下片段

var maskedStr = "1234567*91*"; 

这会抛出一个Ecto.NoResultsError

我有这个定义的

{:ok, data} = Poison.encode(%{email: "nonexisting@user.com", 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) == %{}

但是测试仍然会抛出Ecto.NoResultsError,Any pointers?

2 个答案:

答案 0 :(得分:14)

让我们考虑一下每个环境的运作方式。

  • :prod中,默认设置是呈现错误页面,因此您应该会看到由YourApp.ErrorView呈现的状态代码页面;

  • :dev中,默认设置是显示调试页面,因为大多数时候您在构建代码时出错。如果您想查看实际呈现的错误页面,则需要在debug_errors: false;

  • 中设置config/dev.exs
  • :test中,它的工作方式与生产类似,但由于您是从测试中调用应用程序,因此如果应用程序崩溃,您的测试也会崩溃。我们正在对未来版本进行改进,您应该能够编写类似的内容:

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

答案 1 :(得分:7)

Phoenix 1.1.0引入Phoenix.ConnTest.assert_error_sent/2以便更轻松地测试类似案例。

来自the documentation

  

断言错误被包装并以给定状态发送。

     

用于测试您期望引发错误并将响应包装在HTTP状态中的操作,内容通常由MyApp.ErrorView呈现。

用法示例:

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

response = assert_error_sent 404, fn ->
  get conn(), "/users/not-found"
end
assert {404, [_h | _t], "Page not found"} = response