Devise打破了我的所有测试 - ActiveRecord :: RecordNotUnique PG :: Error

时间:2012-03-30 04:19:33

标签: ruby-on-rails testing devise

我很难过。我有一个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'

我不明白为什么这会影响我的所有测试,或者是什么导致它。以前有人见过这样的东西吗?我在这里做错了什么?

非常感谢任何建议/帮助!

谢谢!

3 个答案:

答案 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应用程序的流程中,因此解释了为什么我得到了原始错误而不是我的模型验证。