gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:56:11 26 4
gpt4 key购买 nike

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

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 手动插入两条相同的记录,则第二次插入将失败,但在测试期间它会通过。

最佳答案

我认为您的迁移和模型是正确的。但是看起来你在断言宏上使用 = 当你应该做这样的事情时:

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

user2 = %Signup{}
|> Signup.changeset(@valid_attrs)

{:error, changeset} = Repo.insert(user2)
refute changeset.valid?
end

这是我的测试工作。
test "only one setting per company" do
first_setting = insert(:setting)
second_setting = params_for(:setting, %{company_id: first_setting.company.id})
changeset = Setting.changeset(%Setting{}, second_setting)
{:error, changeset} = Repo.insert changeset
assert changeset.errors == [company_id: {"has already been taken", []}]
refute changeset.valid?
end

插入是来自 ex-machina 的辅助方法创建一个有效的模型,参数返回一个具有相同 company_id 的有效 map 以强制发生错误。

关于elixir - 如何使用 Ecto 测试唯一性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39439975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com