У меня есть базовая 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)
Как правильно проверить виртуальное поле?