【发布时间】:2016-09-11 19:42:48
【问题描述】:
我正在尝试测试我的数据库中的唯一性,但遇到了一些麻烦。我运行了这个迁移:
def change do
create table(:signups) do
add :name, :string
add :email, :string
timestamps()
end
create unique_index(:signups, [:email])
end
在我的模型中有这个变更集定义:
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
失败的测试是:
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
第二个插入似乎通过了,即使它不应该通过。返回的确切错误是:
1) test duplicate email changeset is invalid (EventSignup.SignupTest)
test/models/signup_test.exs:24
match (=) failed
code: {:error, _changeset} = Repo.insert(user2)
rhs: {:ok,
%EventSignup.Signup{__meta__: #Ecto.Schema.Metadata<:loaded, "signups">,
email: "some@content.com", id: 41,
inserted_at: #Ecto.DateTime<2016-09-11 19:35:40>,
name: "some content",
updated_at: #Ecto.DateTime<2016-09-11 19:35:40>}}
stacktrace:
test/models/signup_test.exs:31: (test)
有人看到我在这里缺少什么吗?如果我通过 iex 手动插入两条相同的记录,第二次插入将失败,但在测试期间它通过了。
【问题讨论】:
-
你确定这个约束存在于测试数据库中吗?也许您在添加约束之前迁移了测试数据库?尝试再次删除、创建和迁移测试数据库 (
MIX_ENV=test mix do ecto.drop, ecto.create, ecto.migrate),然后运行测试。 -
@Dogbert 你是对的。这个错误来自我不知道有一个单独的测试数据库,并且标准混合 ecto.rollback、混合 ecto.migrate 不会涵盖在以后向迁移添加唯一约束。学过的知识。你是第一个,所以如果你把这个作为答案,我很乐意接受。
标签: elixir phoenix-framework ecto