Phoenix控制器测试用例丢失current_user

时间:2018-05-01 01:54:10

标签: elixir phoenix-framework ex-unit

我面临的问题是,我需要在登录用户中声明多个项目的所有测试,似乎它会丢失已保存的会话。

我有一个设置代码,在每次测试之前分配一个灯具用户:

setup %{conn: conn} = config do
  if username = config[:login_as] do
    user = insert_user(username: username)
    conn = assign(conn, :current_user, user)
    {:ok, conn: conn, user: user}
  else
    :ok
  end
end

我在登录区域发生的所有测试都会使用标记login_as: "username"

@tag login_as: "max"
test "redirects to show when data is valid", %{conn: conn} do
  conn = post conn, debit_event_path(conn, :create), debit_event: @create_attrs

  assert %{id: id} = redirected_params(conn)
  assert redirected_to(conn) == debit_event_path(conn, :show, id) #1

  conn = get conn, debit_event_path(conn, :show, id) 
  assert html_response(conn, 200) =~ "Show Debit event" #2
end

第一个断言(代码中的#1注释)始终有效,但由于某种原因,第二个断言(代码中的#2注释)失败,其行为如下如果我的用户已注销它发生在我需要在请求之间保持用户的所有情况。

是否有正确的方法可以将这些数据保留在测试请求中,因为它是浏览器请求?

2 个答案:

答案 0 :(得分:0)

Phoenix将浏览器Cookie模拟为使用Recycling

  

回收

     

浏览器使用cookie实现存储。设置cookie时   响应,浏览器将其存储并在下一个请求中发送。

     

为模拟此行为,此模块提供了回收的概念。   该   recycle/1   函数接收连接并返回一个新的连接,类似   到conn / 0返回的那个包含来自的所有响应cookie   以前的连接定义为请求标头。这很有用   测试需要cookie或会话才能工作的多条路由。

因此,如果您希望在测试中的请求之间保留用户,则需要在会话中存储user_id

答案 1 :(得分:0)

我遇到了类似的问题,Pawel的评论帮助了我...所以在上面的示例中,基于Pawel的回答,您可以执行以下操作,您应该会很好。

  @tag login_as: "max"
  test "redirects to show when data is valid", %{conn: conn} do
    create_conn = post conn, debit_event_path(conn, :create), debit_event: @create_attrs

    assert %{id: id} = redirected_params(create_conn)
    assert redirected_to(create_conn) == debit_event_path(create_conn, :show, id) #1

    show_conn = get conn, debit_event_path(conn, :show, id)
    assert html_response(show_conn, 200) =~ "Show Debit event" #2
  end