测试在具有关联的模式上工作的长生不老药控制器
Testing elixir controller which works on a schema with association
我有一个控制器,可以处理名为表单的模式。此架构与用户有 belongs_to 关联。
当我让测试 运行 我现在得到一个错误,数据无法保存到数据库中,因为夹具中具有 id 的用户不存在。
现在我正在考虑如何解决这个问题。我可以将用户写入数据库并确保始终存在有效用户,或者模拟用户,我猜。
这样做的“规范”方式是什么?如果我应该在数据库中创建用户,我将不得不为(几乎)所有其他模式执行此操作,那么如何干掉它呢?
视情况而定。如果你有很多查询要测试和复杂的关系,有 Ecto.Adapters.SQL.Sandbox。唯一的缺点是您必须在每个测试用例上填充数据库,因为测试应该 运行 随机顺序。
只需为每个测试创建一个新用户。 'canonical' 方法是在 setup
块中执行此操作,因此将用户传递给测试(就像 conn
一样)。例如:
describe "create" do
setup :create_user
test "...", %{conn: conn, user: user} do
data = Map.put(@fixture, "user_id", user.id)
# your test
end
end
defp create_user do
{:ok, user} = MyApp.Accounts.create_user(%{email: "test@example.com"})
%{user: user}
end
除了前面的答案,最好不要使用业务逻辑函数来填充测试数据库,因为那些函数也可能包含错误。
最常见的解决方案是直接插入数据库:https://blog.danielberkompas.com/2015/07/16/fixtures-for-ecto/、
或使用工厂:https://github.com/thoughtbot/ex_machina,它在幕后进行所有插入。
而且无论您选择哪个选项,所有测试都包含在事务中(使用 Ecto.Adapters.SQL.Sandbox)并且数据库会在每次测试后清理。
我有一个控制器,可以处理名为表单的模式。此架构与用户有 belongs_to 关联。
当我让测试 运行 我现在得到一个错误,数据无法保存到数据库中,因为夹具中具有 id 的用户不存在。
现在我正在考虑如何解决这个问题。我可以将用户写入数据库并确保始终存在有效用户,或者模拟用户,我猜。
这样做的“规范”方式是什么?如果我应该在数据库中创建用户,我将不得不为(几乎)所有其他模式执行此操作,那么如何干掉它呢?
视情况而定。如果你有很多查询要测试和复杂的关系,有 Ecto.Adapters.SQL.Sandbox。唯一的缺点是您必须在每个测试用例上填充数据库,因为测试应该 运行 随机顺序。
只需为每个测试创建一个新用户。 'canonical' 方法是在 setup
块中执行此操作,因此将用户传递给测试(就像 conn
一样)。例如:
describe "create" do
setup :create_user
test "...", %{conn: conn, user: user} do
data = Map.put(@fixture, "user_id", user.id)
# your test
end
end
defp create_user do
{:ok, user} = MyApp.Accounts.create_user(%{email: "test@example.com"})
%{user: user}
end
除了前面的答案,最好不要使用业务逻辑函数来填充测试数据库,因为那些函数也可能包含错误。
最常见的解决方案是直接插入数据库:https://blog.danielberkompas.com/2015/07/16/fixtures-for-ecto/、
或使用工厂:https://github.com/thoughtbot/ex_machina,它在幕后进行所有插入。
而且无论您选择哪个选项,所有测试都包含在事务中(使用 Ecto.Adapters.SQL.Sandbox)并且数据库会在每次测试后清理。