0

我面临的问题是,在所有测试中,我需要对登录用户进行不止一件事的断言,它似乎丢失了保存的会话。

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

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 注释)失败,它的行为就像我的用户已注销。在我需要在请求之间保留用户的所有情况下都会发生这种情况。

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

4

2 回答 2

1

我遇到了类似的问题,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
于 2019-02-18T22:06:29.490 回答
0

Phoenix 模拟浏览器 cookie 使用回收

回收

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

为了模拟这种行为,这个模块提供了回收的想法。recycle/1 函数接收一个连接并返回一个新连接,类似于 conn/0 返回的连接,将来自前一个连接的所有响应 cookie 定义为请求标头。 这在测试需要 cookie 或会话才能工作的多个路由时很有用。

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

于 2018-05-04T10:30:28.363 回答