создать пользователя с прибором и использовать идентификатор в @valid_attrs в тесте контроллера Phoenix - PullRequest
1 голос
/ 05 августа 2020

Я новичок в фениксе и эликсире, поэтому спасибо за вашу помощь и исправления!

Я пытаюсь использовать приспособление для создания пользователя и его идентификатора для @valid_attrs и @update_attrs . Однако я не уверен, как получить доступ к пользователю, созданному прибором в блоке описания.

  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>.

Мои другие тесты успешно используют 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? Или я могу воспользоваться другим подходом DRY?

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

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
    ...

To DRY, можно поместить инициализацию в отдельный частный функция (defp fixt_user, do: ...) и передайте ее в setup/1 как

  setup [:fixt_user]
1 голос
/ 05 августа 2020

Я до сих пор не нашел решения исходного вопроса, но я нашел обходной путь, используя setup.

Если кто-нибудь знает, как ответить на исходный вопрос, я был бы очень признателен! Хотя сейчас это работает, я думаю, что синтаксис по-прежнему слишком подробный

setup do
  user = user_fixture()
  %{
    valid_attrs: %{name: "some name", user_id: user.id}
  }
end

test "my test", %{valid_attrs: valid_attrs} do
   assert {:ok, %Pet{} = pet} = Character.create_pet(valid_attrs)
   assert pet.name == "some name"
end

Я отредактировал пример, чтобы было более понятно, почему я хочу, чтобы user_id был ключом в valid_attrs

...