Phoenix Ecto.NoResultsError未自动设置404状态

时间:2016-10-23 17:16:50

标签: elixir phoenix-framework

我有以下控制器操作:

def edit(conn, %{"id" => id}) do
  memo = Repo.get_by!(Memo, id: id, user_id: current_user(conn).id)
  changeset = Memo.changeset(memo)
  render(conn, "edit.html", memo: memo, changeset: changeset)
end

通过以下测试:

test "404s for editing when chosen resource does not belong to current user", %{conn: conn} do
  user = Repo.insert! %User{}
  memo = Repo.insert! %Memo{user: user}
  other_user = Repo.insert! %User{}
  assert_error_sent 404, fn ->
    conn
    |> with_current_user(other_user)
    |> get(memo_path(conn, :edit, memo))
  end
end

控制器中的current_user/1函数从会话中找到当前用户,with_current_user/2测试助手函数为测试请求设置当前用户。

当我运行此测试时,我成功获得了Ecto.NoResultsError,但状态代码为200而不是404。我希望Phoenix应该自动设置404状态,但似乎没有发生。如果我将期望值更改为assert_error_sent 200,则测试通过,但这不是我想要的行为。

如何确保状态为404

1 个答案:

答案 0 :(得分:1)

如果你看http://www.phoenixframework.org/docs/controllers#section-setting-the-http-status,我会尝试

    conn
    |> put_status(404)
    |> render("edit.html", memo: memo, changeset: changeset)