Ecto 插入在网络上失败 post(预期),通过混合测试(意外)
Ecto insert fails on web post (expected), passes on mix test (unexpected)
我有一个控制器,其创建功能如下所示:
def create(conn, %{"data" => refinement_params}) do
case Repo.insert %Refinement{ refinement_code: refinement_params["refinement_code"], team_name: refinement_params["team_name"], organization_id: conn.assigns[:organization_id]} do
{:ok, model} -> json conn, %{refinement_code: model.refinement_code}
{:error, changeset} -> conn |> send_resp(500, "")
end
end
我在模型的变更集中有一个 validate_length(:refinement_code, min: 5) 子句。如果我 post 使用 web REST 工具对控制器使用空 refinement_code,我会按预期收到 500 响应。
在控制器的测试中,我有以下内容:
@invalid_attrs %{refinement_code: "", team_name: ""}
test "/api call to create a voting session with creds but invalid data gets an error code", %{conn: conn} do
organization = Repo.insert! %Organization{domain: "test.com", email: "test.tester@test.com"}
conn = recycle(conn)
|> put_req_header("unique_code", organization.unique_code)
|> put_req_header("domain", organization.domain)
conn = post conn, "/api/refinements", data: @invalid_attrs
assert conn.status == 500
end
在这种情况下,conn.status 出于某种原因是 200。为什么测试错误地失败了?
您没有在控制器操作中使用变更集,因此验证不会 运行。我会出于其他原因检查您的网络请求失败的日志。
要让您的控制器操作使用变更集及其验证,您需要使用如下内容:
changeset = Refinement.changeset(%Refinement{}, refinement_params)
case Repo.insert(changeset) do
....
我有一个控制器,其创建功能如下所示:
def create(conn, %{"data" => refinement_params}) do
case Repo.insert %Refinement{ refinement_code: refinement_params["refinement_code"], team_name: refinement_params["team_name"], organization_id: conn.assigns[:organization_id]} do
{:ok, model} -> json conn, %{refinement_code: model.refinement_code}
{:error, changeset} -> conn |> send_resp(500, "")
end
end
我在模型的变更集中有一个 validate_length(:refinement_code, min: 5) 子句。如果我 post 使用 web REST 工具对控制器使用空 refinement_code,我会按预期收到 500 响应。
在控制器的测试中,我有以下内容:
@invalid_attrs %{refinement_code: "", team_name: ""}
test "/api call to create a voting session with creds but invalid data gets an error code", %{conn: conn} do
organization = Repo.insert! %Organization{domain: "test.com", email: "test.tester@test.com"}
conn = recycle(conn)
|> put_req_header("unique_code", organization.unique_code)
|> put_req_header("domain", organization.domain)
conn = post conn, "/api/refinements", data: @invalid_attrs
assert conn.status == 500
end
在这种情况下,conn.status 出于某种原因是 200。为什么测试错误地失败了?
您没有在控制器操作中使用变更集,因此验证不会 运行。我会出于其他原因检查您的网络请求失败的日志。
要让您的控制器操作使用变更集及其验证,您需要使用如下内容:
changeset = Refinement.changeset(%Refinement{}, refinement_params)
case Repo.insert(changeset) do
....