我在测试时将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执行此操作?
修改
这里是在auth插件中设置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
答案 0 :(得分:2)
由于您在测试中直接在assigns
设置:user_id
,因此如果assigns
包含:current_user
,您需要跳过会话def call(conn, repo) do
if conn.assigns[:current_user] do
conn
else
user_id = get_session(conn, :user_id)
user = user_id && repo.get(Healthlocker.User, user_id)
assign(conn, :current_user, user)
end
end
中的用户在auth插件中:
a = [ [0.453,0.5452,0.252], [0.411,0.352,0.119]]
b = ['toto1','toto2']
res = {}
for i in range(len(a)):
res[b[i]] = a[i]
print (res)