在会话中为当前用户分配测试

时间:2017-02-20 14:57:01

标签: testing elixir phoenix-framework

我找到了与此herehere相似的答案,但似乎没有效果。

我在测试时将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

1 个答案:

答案 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)