ruby-on-rails - Rails 3教程第11章 "Validation failed: Email has already been taken"错误

标签 ruby-on-rails ruby-on-rails-3 rspec rspec-rails railstutorial.org

我的问题出现在 Ruby on Rails 教程的第 11 章 here .

我看到了这个 rspec 错误:

Failure/Error: :user => Factory(:user, :email => Factory.next(:email)))
     ActiveRecord::RecordInvalid:
       Validation failed: Email has already been taken

首先在user_spec.rb中,然后在micropost_spec.rb中。这真是令人费解。我认为每次自动测试运行 rspec 时,工厂语句都会在新的测试数据库中生成用户。我用 git 从 master 分支检查了源文件并再次尝试,但看到了相同的错误。因此,我怀疑它以某种方式与数据库内容有关,而不是与代码有关。

所以,我做了以下事情:

restarted "rails s"  
restarted autotest  
rake db:reset  
rake db:migrate  
rake db:test:prepare  
rake db:populate  

...一切都变绿了。 rspec 测试通过。

可能有一个更“切题”的解决方案,但我很高兴这能奏效。希望它对其他人有帮助。我得出的结论是,我的测试/开发以某种方式向数据库添加了一些意想不到的东西。我认为上述步骤是在第 11 章结束时让自己成为一个新数据库的好方法。

有没有更直接的方法来解决这个问题?该错误是否表明我在没有意识到的情况下解决了其他问题?我认为运行 rspec 并不能保证每次都有新的测试数据库。这是一个错误的假设吗?

最佳答案

在第 9.4 章之后不久,我在集成测试中遇到了麻烦。我的所有 Controller 测试和请求集成测试都失败了,并显示消息“电子邮件已被接收”

我从RailsTutorial - chapter 8.4.3 - Test database not clearing after adding user in integration test中学到了什么是你需要在集成测试后做一些清理工作,因为与单元测试不同,它们可能不会在完成后自行清理。

那里提出的解决方案是使用 DatabaseCleaner gem,其实现也在链接的问题中进行了解释。

我认为,如果您在集成测试后不实现一些清理策略,那么每次运行测试套件时,您将不得不继续使用“霰弹枪”解决方案来清理数据库。绝对不好玩。

关于ruby-on-rails - Rails 3教程第11章 "Validation failed: Email has already been taken"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5308307/

相关文章:

ruby-on-rails - Rails 4 + 设计使用电子邮件或用户名和强参数登录

ruby-on-rails - 使 database.yml 文件在 OSX 上的 Rails 中工作

ruby-on-rails - RefineryCMS 与现有 Rails 3.1+ 应用程序集成

ruby-on-rails-3 - 使用 Rails 3 RC、Mongoid、Recaptcha 和 RSpec 触发 protected "reject"方法

ruby-on-rails - 在不加载 ActiveRecord 的情况下测试 Rails 模块

ruby-on-rails - 期待 <"edit"> 但使用 <[]> 渲染

jquery - 跨域登录后未设置 Set-Cookie session

ruby-on-rails - 在 ruby​​ 的纯 HTML 上按位置查找值

ruby-on-rails - 路由错误 没有路由匹配 [POST] "/book/create"

ruby-on-rails - 如何将redirect_to() 与rails 3 中当前params[] 数组中的所有内容一起使用?