我很难过。我有一个rails应用程序(3.1.3),我一直在建立我最近添加设计(2.0),以创建用户模型和随之而来的相应身份验证。安装完设计并运行 rake test 之后,我的所有测试都发出了同样的错误。在单元和功能测试中,我得到了一个如下错误:
ERROR should get index (0.05s)
ActiveRecord::RecordNotUnique: PG::Error: 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 ('2012-03-30 04:13:13', '2012-03-30 04:13:13', 298486374)
/Users/myname/.rvm/gems/ruby-1.9.2-p290@global/gems/activerecord-3.1.3/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec'
我不明白为什么这会影响我的所有测试,或者是什么导致它。以前有人见过这样的东西吗?我在这里做错了什么?
非常感谢任何建议/帮助!
谢谢!
答案 0 :(得分:36)
如果有人提出这个问题,答案是由Cam Norgate在评论中提供的。
问题在于test / fixtures / users.yml文件
one: {}
# column: value
#
two: {}
# column: value
它正在创建两个空用户(一个和两个),没有电子邮件。只需在两条未注释的行之前发表评论。
答案 1 :(得分:1)
Devise期待一个独特的电子邮件列,您尝试使用email = nil保存多个用户。检查您的测试设备,您可能只是忘了为灯具用户设置电子邮件。
答案 2 :(得分:1)
由于各种原因,可能会发生此错误。它有助于查看PG :: Error:ERROR的完整回溯,您将看到一些应该导致此错误的app / lib代码,用于您的特定用例。
在我的情况下,这是因为我在我的规范套件中通过capybara(点击“注销”)帮助程序将设计登录/注销规范助手与我自己的自定义注销混合。然后Devise调用了一些通过update_tracked_fields更新用户字段的方法!并且在那时必须创建一个空的用户试图保存。
由于这是规范助手(使用warden / rack等),它发生在我的rails应用程序的流程中,因此解释了为什么我得到了原始错误而不是我的模型验证。