在我的凤凰控制器中,我使用:
...
def delete(conn, %{"id" => id}) do
post = Repo.get!(Post, id)
with {:ok, %{post: %Post{}}} <- Posts.delete_post(post) do
send_resp(conn, :no_content, "")
end
end
...
在我的测试中:
...
test "deletes chosen post", %{conn: orig_conn, user: user, post: post} do
conn = delete orig_conn, v1_post_path(orig_conn, :delete, post)
assert response(conn, 204)
conn = delete orig_conn, v1_post_path(orig_conn, :delete, post)
assert response(conn, 404)
end
...
但是当 POST 不存在时,此测试将失败:
...
** (Ecto.NoResultsError) expected at least one result but got none in query:
...
为什么?正如我所看到的,Ecto.NoResultsError 应该返回 404 的状态
凤凰城版本 1.3,凤凰城 3.3, ecto 2.1
默认情况下,Phoenix 将测试环境配置为呈现异常错误。这是故意的,否则代码中的错误将在测试中变成 500 页,您必须追溯到该页面。这就是你得到例外的原因。
幸运的是,对于您要检查此类异常会获得的状态代码的情况,有assert_error_sent:
assert_error_sent :not_found, fn ->
get build_conn(), "/users/not-found"
end
assert_error_sent 404, fn ->
get build_conn(), "/users/not-found"
end