【发布时间】:2017-07-09 22:03:15
【问题描述】:
我找到了与 here 和 here 类似的答案,但它似乎不起作用。
我在测试时无法将current_user 分配给会话。我的测试是这样设置的
setup do
%User{
id: 123456,
name: "MyName",
email: "abc@gmail.com",
password_hash: Comeonin.Bcrypt.hashpwsalt("password")
} |> Repo.insert
{:ok, user: Repo.get(User, 123456) }
end
我的测试是
test "renders index.html on /coping-strategy", %{user: user} do
conn = conn
|> assign(:current_user, user)
|> get(coping_strategy_path(conn, :index))
assert html_response(conn, 200) =~ "Coping strategies"
end
当我在这里检查 conn 时,current_user 已正确分配给 user。但是,当我在测试期间检查控制器中的 conn 时,current_user 始终是nil。我也尝试使用build_conn,但它仍然为零。
这里是控制器:
def index(conn, _params) do
user_id = conn.assigns.current_user.id
coping_strategies = Post
|> Post.get_coping_strategies(user_id)
|> Repo.all
render conn, "index.html", coping_strategies: coping_strategies
end
如果我尝试分配除 current_user 之外的其他内容,那么当我检查控制器中的 conn 时,它就会显示出来。因此,如果我在测试中添加了|> assign(:stuff, "test"),那么我在 conn 中分配了stuff: "test"。如果我在测试和控制器中将 current_user 更改为 current_user2,它会起作用,因为 current_user2 会更新并按照我的预期传递。
有什么原因我不能像这样分配当前用户,为什么它总是为零?我是否缺少任何步骤来特别针对 current_user 执行此操作?
编辑
这是在身份验证插件中设置 current_user 的位置
def call(conn, repo) do
user_id = get_session(conn, :user_id)
user = user_id && repo.get(Healthlocker.User, user_id)
assign(conn, :current_user, user)
end
【问题讨论】:
-
您能否在您的应用程序中发布分配
current_user的代码(身份验证插件?)?即使已经设置,您也可能将其设置为nil。 -
@Dogbert 看起来像。当我运行测试时,用户是
nil。
标签: testing elixir phoenix-framework