Phoenix Framework:为测试播种数据库的正确方法是什么?
Phoenix Framework: What's the correct way to seed database for testing?
我正在构建我的第一个 Phoenix 应用程序,并且正在尝试编写一个测试来验证在连接的身份验证 header 中从 JWT 检索到的用户是正确的用户,已通过身份验证等。
为此测试使用单个记录为数据库播种的正确方法是什么?
是否应该这样做:
- 在全球范围内,使用
test/test_helper.exs
文件,要求 priv/repo/seeds.exs
并执行手动 Ecto 操作
或
- 每次测试(在这种情况下我不确定如何最好地进行)
最后,在成功 运行 测试后清理测试数据库的正确方法是什么,这样我就可以避免每次都尝试创建相同的记录我 运行 是时候考试了吗?
通常最好的方法是将测试彼此分开,并在每个测试中初始化所有内容。测试在 Ecto 事务中 运行,所以最后一切都回滚了,没有垃圾了。这也允许 运行ning 并行测试。但这意味着必须在每次测试开始时手动插入用户。如果您有更多依赖于用户和当前会话的测试,您可以将此通用代码提取到标签中。
通常有关登录用户的数据保存在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中有描述。我真的很推荐那本书!
我正在构建我的第一个 Phoenix 应用程序,并且正在尝试编写一个测试来验证在连接的身份验证 header 中从 JWT 检索到的用户是正确的用户,已通过身份验证等。
为此测试使用单个记录为数据库播种的正确方法是什么?
是否应该这样做:
- 在全球范围内,使用
test/test_helper.exs
文件,要求priv/repo/seeds.exs
并执行手动 Ecto 操作
或
- 每次测试(在这种情况下我不确定如何最好地进行)
最后,在成功 运行 测试后清理测试数据库的正确方法是什么,这样我就可以避免每次都尝试创建相同的记录我 运行 是时候考试了吗?
通常最好的方法是将测试彼此分开,并在每个测试中初始化所有内容。测试在 Ecto 事务中 运行,所以最后一切都回滚了,没有垃圾了。这也允许 运行ning 并行测试。但这意味着必须在每次测试开始时手动插入用户。如果您有更多依赖于用户和当前会话的测试,您可以将此通用代码提取到标签中。
通常有关登录用户的数据保存在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中有描述。我真的很推荐那本书!