Ecto插入在Web帖子上失败(预期),传递混合测试(意外)

时间:2015-11-16 04:06:58

标签: elixir phoenix-framework ecto

我有一个带有创建功能的控制器,如下所示:

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)子句。如果我使用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。为什么测试失败了?

1 个答案:

答案 0 :(得分:2)

您未在控制器操作中使用变更集,因此无法运行验证。我会检查日志是否有其他原因导致您的网络请求失败。

要使控制器操作使用变更集及其验证,您需要使用以下内容:

    changeset = Refinement.changeset(%Refinement{}, refinement_params)
    case Repo.insert(changeset) do
    ....