Phoenix Framework:种子数据库进行测试的正确方法是什么?

Tim*_*Tim 5 testing elixir ecto phoenix-framework

我正在构建我的第一个 Phoenix 应用程序,并尝试编写一个测试来验证从连接的 Authentication 标头中的 JWT 检索到的用户是否是正确的用户、是否经过身份验证等。

用于此测试的使用单个记录为数据库播种的正确方法是什么?

是否应该这样做:

  • test/test_helper.exs通过要求priv/repo/seeds.exs和执行手动 Ecto 操作,在全局范围内使用该文件

或者

  • 每次测试(在这种情况下我不确定如何最好地进行)

最后,成功运行测试后清理测试数据库的正确方法是什么,这样我就可以避免每次运行测试时都尝试创建相同的记录?

tko*_*wal 4

通常最好的方法是将测试彼此分开并初始化每个测试的所有内容。测试在 Ecto 事务内运行,因此所有内容都会在最后回滚,并且不会留下任何垃圾。这也允许并行运行测试。但这意味着用户必须在每次测试开始时手动插入。如果您有更多取决于用户和当前会话的测试,您可以将此通用代码提取到标签中。

通常有关登录用户的数据保存在conn.assigns. 让我们假装它处于调音状态:user

在你的App.ConnCase setup函数中添加如下内容:

setup %{conn: conn} = config do
  my_user_email = config[:logged_as]
  cond do
    my_user_email ->
      {:ok, user} = Repo.insert(...)
      conn_with_user = assign(conn, :user, user)
      {:ok, conn: conn_with_user, user: user}
  end
Run Code Online (Sandbox Code Playgroud)

现在,在您的测试中,您可以在 conn 和新帐户上进行匹配:

@logged_as "user.userowski@company.com"
test "JWT works correctly", %{conn: conn, user: user} do
  # user is now in the db
  # you don't have to retrieve it, because it is passed with test setup
  # you can start testing JWT 
end
Run Code Online (Sandbox Code Playgroud)

该方法在《Programming Phoenix》中有所描述。我真的推荐那本书!