小编tar*_*gaf的帖子

如何使用Ecto测试唯一性约束

我正在尝试测试数据库中的唯一性,但遇到了一些麻烦。我运行了此迁移:

def change do
  create table(:signups) do
    add :name, :string
    add :email, :string

    timestamps()
  end

  create unique_index(:signups, [:email])
end
Run Code Online (Sandbox Code Playgroud)

在我的模型中有这个changeset def:

def changeset(struct, params \\ %{}) do
  struct
  |> cast(params, [:name, :email])
  |> validate_required([:name, :email])
  |> validate_format(:email, ~r/@/)
  |> update_change(:email, &String.downcase/1)
  |> unique_constraint(:email)
end
Run Code Online (Sandbox Code Playgroud)

而失败的测试是:

test "duplicate email changeset is invalid" do
  %Signup{}
  |> Signup.changeset(@valid_attrs)
  |> Repo.insert!

  user2 = %Signup{}
  |> Signup.changeset(@valid_attrs)
  assert {:error, _changeset} = Repo.insert(user2)
end
Run Code Online (Sandbox Code Playgroud)

第二个插入似乎通过了,尽管它没有通过。返回的确切错误是:

1) test duplicate email changeset is invalid (EventSignup.SignupTest)
     test/models/signup_test.exs:24
     match (=) …
Run Code Online (Sandbox Code Playgroud)

elixir ecto phoenix-framework

5
推荐指数
2
解决办法
1339
查看次数

标签 统计

ecto ×1

elixir ×1

phoenix-framework ×1