Тестирование виртуальных полей, возвращающих ноль в Фениксе - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть базовая user схема, которая содержит password_digest для сохранения в БД и виртуальных полях password, которые пользователь будет вводить, хэшировать, сохранять как password_digest.

Проблема заключается в тестировании,Я получаю пароль как ноль на одной стороне сравнения, в то время как на другой я получаю их как ноль.Я не уверен, что лучше всего тестировать виртуальные поля.

Сообщение об ошибке:

...
Assertion with == failed
 code:  assert Accounts.get_user!(user.id()) == user
 left:  ... username: "some username", password: nil}
 right: ... username: "some username", password: "some password"}

  schema "users" do
    field :email, :string
    field :password_digest, :string
    field :username, :string

    timestamps()

    field :password, :string, virtual: true
  end

Вот соответствующие коды:

def changeset(user, attrs) do
    user
    |> cast(attrs, [:username, :email, :password])
    |> hash_password
    |> validate_required([:username, :email, :password, :password_digest])
  end

  defp hash_password(changeset) do
    if password = get_change(changeset, :password) do
      changeset
      |> put_change(:password_digest, hashpwsalt(password))
    else
      changeset
    end
  end

Внутри теста, У меня есть такие:

@valid_attrs %{email: "some email", password: "some password", username: "some username"}


def user_fixture(attrs \\ %{}) do
  {:ok, user} =
    attrs
    |> Enum.into(@valid_attrs)
    |> Accounts.create_user()

  user
end

...

test "get_user!/1 returns the user with given id" do
  user = user_fixture()
  assert Accounts.get_user!(user.id) == user
end

Кстати, get_user прямо от генератора: def get_user!(id), do: Repo.get!(User, id)

Как правильно проверить виртуальное поле?

1 Ответ

0 голосов
/ 23 ноября 2018

Это ожидаемое поведение, поскольку Accounts.get_user!(user.id) не заполнит виртуальный атрибут.Он изменяется только при наборе изменений, и вы не вносите никаких изменений.

В этом случае я думаю, что для вас важно проверить, установлен ли password_digest.

...