Elixir 为什么这次考试不及格?
我做了一个测试来更新应该通过的用户变更集,但用户的验证不允许它通过,如果这是noob,很抱歉,我只是从elixir开始Elixir 为什么这次考试不及格?,elixir,phoenix-framework,Elixir,Phoenix Framework,我做了一个测试来更新应该通过的用户变更集,但用户的验证不允许它通过,如果这是noob,很抱歉,我只是从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_r
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
**(Exto.InvalidChangesetError)无法执行更新,因为变更集无效。
错误
%{
电子邮件:[{“不能为空”,[validation::required]}],
名称:[{“不能为空”,[validation::required]}],
密码:[{“不能为空”,[validation::required]},
密码确认:[{“不能为空”,[validation::required]}]
}
应用的更改
%{is_active:nil}
Params
%{
“电子邮件”=>无,
“是否处于活动状态”=>nil,
“name”=>nil,
“密码”=>nil,
“密码确认”=>无
}
变更集
所有的线路都用过了
#外部变更集<
动作::更新,
更改:%{is_active:nil},
错误:[
名称:{“不能为空”,[validation::required]},
电子邮件:{“不能为空”,[validation::required]},
密码:{“不能为空”,[validation::required]},
密码确认:{“不能为空”,[validation::required]}
],
数据:#TrelloClone.Auth.User,
有效?:错误
@invalid\u attrs%{name:nil,email:nil,is\u active:nil,password:nil,password\u confirmation:nil}
def更新(conn,%{“id”=>id,“用户”=>user_params})是否执行
user=Auth.get\u user!(id)
使用{:确定,%User{}=User}User.changeset(attrs)
|>Repo.update!()
结束
def get_用户!(id),do:Repo.get!(用户,id)
这是所有已使用的行,obs:它们位于不同的文件中,Auth是用户的上下文根据文档,您在
update\u User/2
与相同,但如果变更集无效,则返回结构或引发
在无效变更集上引发异常,您的测试失败。如果您确实希望在不正确的输入上引发,您可以使用
test“数据无效时呈现错误”,%%{conn:conn,user:user}do
assert_raise exto.InvalidChangesetError,fn->
put(conn,Routes.api\u user\u路径(conn,:update,user),user:@invalid\u attrs)
结束
结束
但由于您希望显示422
,因此最好在update\u user/2
中使用Repo.update/2
def update_user(%user{}=user,attrs)do
用户
|>用户变更集(attrs)
|>Repo.update()#不是Repo.update!()
结束
你能在控制器中显示什么是@invalid_attrs以及你的代码来更新用户吗?我会把状态设置为update
notupdate在update\u user
函数中使用code>。您的@invalid\u attrs
映射使用原子键(例如%{id:nil}
,但是您的update
函数需要字符串键上的模式匹配,例如%{id=>id}
。这是这里发生的事情的一部分吗?您可以从用户模块粘贴变更集函数吗?
@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)