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



我被难住了。我有一个rails应用程序(3.1.3),我一直在构建它,我最近添加了design(2.0),以创建用户模型和相应的身份验证。在我安装了design并运行rake测试后,我的所有测试都出现了相同的错误。在单元和功能测试中,我都得到了一个错误,看起来像这样:

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'

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

如有任何建议/帮助,我们将不胜感激!

谢谢!

为了防止有人问这个问题,Cam Norgate在评论中提供了答案。

问题出在文件test/gfixtures/users.yml 中

one: {}
#  column: value
#
two: {}
#  column: value

它试图创建两个没有电子邮件的空用户(一个和两个)。只需在未注释的两行之前加一条注释即可。

Devise需要一个唯一的电子邮件列,而您正试图用电子邮件=nil来保存多个用户。检查您的测试设备,您可能只是忘记为设备用户设置电子邮件。

此错误可能由于各种原因而发生。它有助于查看PG::Error:Error的完整回溯,对于您的特定用例,您将看到一些应该导致此错误的app/lib代码。

在我的情况下,这是因为我在规范套件中混合了设计登录/注销规范助手和我自己的自定义注销(点击"注销")助手。Devise随后调用了一些方法,通过update_tracked_fields更新用户字段!并且在这一点上一定创建了一个试图保存的空用户。

由于这是规范助手(使用仓库管理员/机架等),它发生在我的rails应用程序的流程之外,因此解释了为什么我得到了一个原始错误,而不是进行模型验证。

最新更新