我用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?
答案 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
以便更轻松地测试类似案例。
断言错误被包装并以给定状态发送。
用于测试您期望引发错误并将响应包装在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