Ecto.NoResults控制器测试中的错误



在我的凤凰控制器中,我使用:

...
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

最新更新