首页 > 解决方案 > 在 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 中使用用户变量?还是我可以采取另一种更干燥的方法?

标签: erlangelixirphoenix-framework

解决方案


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/1as

  setup [:fixt_user]

推荐阅读