Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 为什么这次考试不及格?_Elixir_Phoenix Framework - Fatal编程技术网

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

我做了一个测试来更新应该通过的用户变更集,但用户的验证不允许它通过,如果这是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_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
not
updateupdate\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)