为什么在我的凤凰测试中会出现此外键错误?

时间:2019-10-14 21:35:48

标签: testing ecto phoenix

我在Phoenix进行了以下测试:

test "list_orders/0 returns all orders" do
  {:ok, user} = %User{}
                |> User.changeset(@user_attrs)
                |> Repo.insert()

  changeset = %Order{}
              |> Order.changeset(@valid_attrs)
              |> Ecto.Changeset.put_change(:user_id, user.id)

  {:ok, order} = Repo.insert(changeset)

  assert MWS.list_orders() == [order]
end

由于changeset失败了外键约束,因此未能将Repo插入user_id中。但是我正在使用从用户返回的user.id成功插入数据库吗?

知道我在做什么错吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

正如卡尔文·霍姆(Kalvin Hom)所指出的,您需要查看架构/迁移以了解这一点:

defmodule BarronWatchCompany.Repo.Migrations.AddUsersToOrders do
  use Ecto.Migration

  def change do

    alter table(:orders) do
      add :user_id, references(:orders, on_delete: :nothing)
    end

    create index(:orders, [:user_id])
  end
end

问题是我在参考订单而不是用户。我已经迁移了数据库:

defmodule BarronWatchCompany.Repo.Migrations.AddUserToOrders do
  use Ecto.Migration

  def up do
    drop constraint(:orders, "orders_user_id_fkey")

    alter table(:orders) do
      modify :user_id, references(:users, on_delete: :nothing), null: false
    end
  end
end

现在我可以创建订单了:)