存根Guardian.Plug.EnsureAuthenticated用于Phoenix控制器测试
我在我的路由器管道中有Guardian.Plug.EnsureAuthenticated
。如何在Controller测试期间让它通过?存根Guardian.Plug.EnsureAuthenticated用于Phoenix控制器测试
我拿到了我的Phoenix授权控制器测试通过。这里是我的解决方案:
测试/控制器/ inbox_controller_test.exs:
defmodule MyApp.InboxControllerTest do
use MyApp.ConnCase
alias MyApp.User
setup do
user = %User{id: "a1234"}
{:ok, jwt, full_claims} = Guardian.encode_and_sign(user)
{:ok, %{user: user, jwt: jwt, claims: full_claims}}
end
test "lists all entries on index", %{jwt: jwt} do
conn = conn()
|> put_req_header("authorization", "Bearer #{jwt}")
|> get(inbox_path(conn, :index))
assert json_response(conn, 200)["inboxes"] == []
end
end
配置/ test.exs:
config :guardian, Guardian,
serializer: MyApp.TestGuardianSerializer
测试/支持/ test_guardian_serializer.ex:
defmodule MyApp.TestGuardianSerializer do
@behaviour Guardian.Serializer
alias MyApp.User
def for_token(user = %User{}), do: { :ok, "User:#{user.id}" }
def for_token(_), do: { :error, "Unknown resource type" }
def from_token("User:" <> id) do
{:ok, %User{id: id, login: "admin"}}
end
def from_token(_), do: { :error, "Unknown resource type" }
end
我通过创建一个测试标记解决了这个问题,该测试标记使用Guardian的sign_in
方法(如果在Guardian 0.14.x上使用api_sign_in
)创建并记录用户。然后,你可以将它应用于那些需要登录的用户,像这样的测试:
setup %{conn: conn} = config do
cond do
config[:login] ->
user = insert_user()
signed_conn = Guardian.Plug.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
如果你需要你只是一个断言创建的用户,你可以通过它与连接一起:
config[:login] ->
user = insert_user()
signed_conn = Guardian.Plug.sign_in(conn, user)
{:ok, conn: signed_conn, user: user}
在测试
和模式匹配它:
@tag :login
test "shows page only when logged in", %{conn: conn, user: user} do
# ...
end
考虑insert_user
逻辑移动到setup_all
块以减少数据库操作和加快吨EST序列。
这只会给我一个错误的'功能Guardian.Plug.api_sign_in/2是未定义的(模块Users.Guardian.Plug不可用)'。你确定这个功能存在吗? – Sebastialonso
@Sebastialonso是的,如果您切换到Guardian 0.14.x.它可能被删除或重命名为Guardian 1.x,这可能是你正在使用的。 – Svilen
哇,谢谢@arkadiy这真的帮了我。 –