【问题标题】:Rails 4 testing user initialization is always blankRails 4 测试用户初始化总是空白
【发布时间】:2013-10-25 05:43:06
【问题描述】:

嘿,我有一个看起来像这样的测试

test 'create account' do
    if User.create(email: 'me@test.com', password: 'blahblah')
        assert true
    else
        assert User.msg
    end
end

但是当我尝试运行它时,我收到如下错误消息:

  1) Error:
UserTest#test_create_account:
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_email"
DETAIL:  Key (email)=() already exists.
: INSERT INTO "users" ("created_at", "updated_at", "id") VALUES ('2013-10-16 21:59:54', '2013-10-16 21:59:54', 298486374)

这在我看来好像我没有初始化电子邮件,但据我所知,这应该用我上面的创建来初始化。我正在使用强大的参数,所以我没有启用任何 attr_accessable 并且我可以运行它。有谁知道这可能是什么原因造成的?如果您想了解更多信息,请告诉我。

【问题讨论】:

  • 您的电子邮件属性肯定有唯一的验证。这会引发错误,因为 me@test.com 已经由另一个用户创建和/或保存在您的数据库中。如果您更改电子邮件参数,您会收到相同的错误吗?如果你运行两次呢?
  • @JeremyS 感谢您的帮助!我尝试更改它,即使使用完全独特的东西,我也会得到相同的错误。如果您查看 SQL,它似乎只插入了 created_at、update_at 和 id
  • 试试email: "#{SecureRandom.uuid}@test.com"
  • 啊啊!我得到了它。当我生成脚手架时,Rails 自动添加了空白固定装置。无论出于何种原因,这在我的测试中都显示为错误。 (不应该单独显示吗?)非常感谢您的帮助。
  • 这对以后有帮助,谢谢发帖!

标签: ruby-on-rails ruby unit-testing tdd


【解决方案1】:

这是由轨道脚手架自动生成的固定装置引起的。无论出于何种原因,这都会出现在测试内部而不是它自己的部分中。当我修复固定装置时,此错误停止出现。

【讨论】:

  • 嗨@lethjakman,我使用的是 factory_girls 而不是固定装置,那么它也给了我同样的问题。有什么想法吗?
  • 嘿,我知道这有点晚了,但我认为迟到总比没有好,对吧?仔细检查以确保工厂女孩无论如何都不会为您生成夹具,并确保您的工厂不会在数据库端进行唯一验证。这是我所知道的可能导致此错误的两个问题。
【解决方案2】:

如果您收到 PostgreSQL 唯一键违规错误消息,可能是您的主键索引不同步,例如填充数据库后。

使用ActiveRecord::Base.connection.reset_pk_sequence!('users') 使 User 表的主键索引再次同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多