Почему этот тест не проходит? - PullRequest
0 голосов
/ 06 мая 2020

Я провел тест для обновления набора изменений пользователя, который должен пройти с недопустимыми данными, но проверка пользователя не позволяет ему пройти, извините, если это нуб, я просто начинаю с elixir

   test "renders errors when data is invalid", %{conn: conn, user: user} do
      assert conn = put(conn, Routes.api_user_path(conn, :update, user), user: @invalid_attrs)
      assert json_response(conn, 422)["errors"] != %{}
    end
  end

Вывод


** (Ecto.InvalidChangesetError) could not perform update because changeset is invalid.

     Errors

         %{
           email: [{"can't be blank", [validation: :required]}],
           name: [{"can't be blank", [validation: :required]}],
           password: [{"can't be blank", [validation: :required]}],
           password__confirmation: [{"can't be blank", [validation: :required]}]
         }

     Applied changes

         %{is_active: nil}

     Params

         %{
           "email" => nil,
           "is_active" => nil,
           "name" => nil,
           "password" => nil,
           "password__confirmation" => nil
         }

     Changeset
Thats all lines been used

         #Ecto.Changeset<
           action: :update,
           changes: %{is_active: nil},
           errors: [
             name: {"can't be blank", [validation: :required]},
             email: {"can't be blank", [validation: :required]},
             password: {"can't be blank", [validation: :required]},
             password__confirmation: {"can't be blank", [validation: :required]}
           ],
           data: #TrelloClone.Auth.User<>,
           valid?: false
   @invalid_attrs %{name: nil, email: nil, is_active: nil,password: nil,password__confirmation: nil}


def update(conn, %{"id" => id, "user" => user_params}) do
    user = Auth.get_user!(id)

    with {:ok, %User{} = user} <- Auth.update_user(user, user_params) do
      render(conn, "show.json", user: user)
    end
  end


  def update_user(%User{} = user, attrs) do
    user
    |> User.changeset(attrs)
    |> Repo.update!()
  end


 def get_user!(id), do: Repo.get!(User, id)

Это все строки были использованы, obs: они находятся в разных файлах, Auth - это контекст пользователя

1 Ответ

1 голос
/ 06 мая 2020

Согласно документации, Repo.update! вы используете в update_user/2

То же, что Repo.update/2, но возвращает структуру или возникает, если набор изменений недействителен .

Исключение возникает в недопустимом наборе изменений, и ваш тест запускается. Если вы действительно хотите поднять при неправильном вводе, вы можете изменить тест с помощью ExUnit.Assertions.assert_raise/2

test "renders errors when data is invalid", %{conn: conn, user: user} do
  assert_raise  Ecto.InvalidChangesetError, fn ->
    put(conn, Routes.api_user_path(conn, :update, user), user: @invalid_attrs)
  end
end

Но поскольку вы хотите отображать 422, вам лучше использовать Repo.update/2 в update_user/2

def update_user(%User{} = user, attrs) do
  user
  |> User.changeset(attrs)
  |> Repo.update() # not Repo.update!()
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...