erlang - 在 phoenix 控制器测试中使用夹具创建用户并在 @valid_attrs 中使用 id
问题描述
我对凤凰和长生不老药很陌生,所以感谢您的帮助和指正!
我正在尝试使用固定装置来创建用户并为@valid_attrs 和@update_attrs 使用他们的ID。但是我不确定如何访问由描述块中的夹具创建的用户。
describe "my test" do
alias MyApp.Context.Module
user = user_fixture()
@valid_attrs %{name: "some name", user_id: user.id}
@update_attrs %{name: "some updated name", user_id: user.id}
@invalid_attrs %{name: nil, user_id: nil}
...
end
但是,当我mix test
为上述内容运行时,我得到
== Compilation error in file test/little_things/character_test.exs ==
** (DBConnection.OwnershipError) cannot find ownership process for #PID<0.410.0>.
我的其他测试成功地使用了 setup 方法中的 user_fixture
describe "another example test" do
setup do
%{user: user_fixture()}
end
test "example test using setup", %{user: user} do
IO.puts(user.id) # This will print the user id
end
end
但是我发现它写起来过于冗长,并且想预先定义我可以在整个测试中使用的valid_attrs,而不必在使用 test/2 中的第二个参数时传递值
如何在@valid_attrs 和@updated_attrs 中使用用户变量?还是我可以采取另一种更干燥的方法?
解决方案
ExUnit.Case.describe/2
可能有自己的setup/1
回调,所以下面应该工作。
describe "my test" do
setup do
user = user_fixture()
[
user: user,
valid_attrs: %{name: "some name", user_id: user.id},
update_attrs: %{name: "some updated name", user_id: user.id},
invalid_attrs: %{name: nil, user_id: nil}
]
end
test "foo", %{user: user, valid_attrs: valid_attrs, ...} do
...
为了 DRY,可以将初始化放入一个单独的私有函数 ( defp fixt_user, do: ...
) 并将其传递给setup/1
as
setup [:fixt_user]