【问题标题】:Testing token authentication测试令牌认证
【发布时间】:2016-07-03 20:21:18
【问题描述】:

我正在努力测试需要令牌标头的 api 端点。这个想法是测试两种情况,有和没有身份验证令牌。

我想出了以下可行的解决方案,但我觉得有点笨拙。

  defmodule MyApi.SecretControllerTest do
    use MyApi.ConnCase

    alias MyApi.{Repo, User, Session}

    setup %{conn: conn} do
      user = create_user(%{name: "john"})
      session = create_session(user)

      conn = conn
      |> put_req_header("accept", "application/json")
      |> put_req_header("authorization", "Bearer " <> session.token)
      {:ok, conn: conn}
    end

    def create_user(%{name: name}) do
      User.changeset(%User{}, %{email: "#{name}@gmail.com"})
      |> Repo.insert!
    end

    def create_session(user) do
      Session.create_changeset(%Session{user_id: user.id}, %{})
      |> Repo.insert!
    end

    test "returns 401 error when user is not authenticated" do
      conn = get build_conn, "/api/secrets"
      assert json_response(conn, 401)["error"] != %{}
    end

    test "renders secret resource when user is authenticated", %{conn: conn} do
      conn = get conn, secret_path(conn, :index)
      assert json_response(conn, 200)["message"] != %{}
    end
  end

【问题讨论】:

  • 欢迎来到stackoverflow!您的代码似乎可以按您的预期工作,因此我们在这里无能为力。如果您确实认为有问题,请尝试在问题中解释预期的行为/结果。
  • 是的,我知道这段代码按预期工作,我在问是否有更方便的方法来测试这类事情。实际上 401 错误的测试特别难看,因为我不知道如何管理这个而不是避免连接设置。
  • @Slyfest 您为您的应用使用什么身份验证库?有一种更好的方法可以做到这一点,但仅适用于您使用 Guardian 时,因此我的问题。

标签: elixir phoenix-framework


【解决方案1】:

如果您使用Guardian 进行身份验证,并且端点是一个API(例如,通过:api 管道),您可以使用api_sign_in 辅助方法,它不依赖于现有会话(因此您可以删除该会话相关的代码)。

这是一个将“登录”逻辑放入测试标签的示例,您可以将其应用于需要登录用户的测试:

  setup %{conn: conn} = config do
    cond do
      config[:login] ->
        user = insert_user()
        signed_conn = Guardian.Plug.api_sign_in(conn, user)
        {:ok, conn: signed_conn}
      true ->
        :ok
    end
  end

  @tag :login
  test "shows page only when logged in", %{conn: conn} do
    conn = get(conn, some_page_path(conn, :index))
    assert html_response(conn, 200)
  end

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2020-09-25
    • 2017-04-20
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多