gpt4 book ai didi

在 Phoenix 中测试返回 nil 的虚拟字段

转载 作者:行者123 更新时间:2023-11-28 20:49:23 25 4
gpt4 key购买 nike

我有一个基本的 user 模式,其中包含要保存在数据库中的 password_digest 和用户将输入、散列、保存的虚拟字段 password作为 password_digest。

问题是在测试时,我在比较的一侧得到的密码为 nil,而另一侧的密码为非 nil。我不确定测试虚拟字段时的最佳做法是什么。

错误信息:

...
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),执行:Repo.get!(User, id)

测试虚拟场的正确方法是什么?

最佳答案

这是预期的行为,因为 Accounts.get_user!(user.id) 不会填充虚拟属性。它仅在变更集上更改,您没有进行任何更改。

在这种情况下,我认为与您相关的是测试是否设置了 password_digest

关于在 Phoenix 中测试返回 nil 的虚拟字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53435378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com