凤凰框架:什么是种子数据库进行测试的正确方法?

时间:2016-05-28 14:15:01

标签: testing elixir phoenix-framework ecto

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

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

是否应该这样做:

  • 全局,使用test/test_helper.exs文件,要求priv/repo/seeds.exs并执行手动Ecto操作

OR

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

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

1 个答案:

答案 0 :(得分: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

现在在您的测试中,您可以匹配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

此方法在Programming Phoenix中描述。我真的推荐这本书!