Rails 3教程第11章"验证失败:已经收到电子邮件"错误

Per*_*ich 9 rspec ruby-on-rails rspec-rails ruby-on-rails-3 railstutorial.org

我的麻烦出现在Ruby的第11章on Rails的教程在这里.

我看到这个rspec错误:

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

先在user_spec.rb那里micropost_spec.rb.这真是令人费解.我认为每次autotest运行rspec时,工厂语句都在一个新的测试数据库中生成一个用户.我用git检查了主分支中的源文件并再次尝试,但看到了同样的错误.因此我怀疑它与db内容有关,而不是代码.

所以,我做了以下事情:

restarted "rails s"  
restarted autotest  
rake db:reset  
rake db:migrate  
rake db:test:prepare  
rake db:populate  
Run Code Online (Sandbox Code Playgroud)

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

可能有一个更"重要"的解决方案,但我很激动这个工作.希望它可以帮助别人.我只能得出结论,我的测试/开发以某种方式向db添加了一些意想不到的东西.我想上面的步骤是在第11章结尾附近让自己成为新数据库的好方法.

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

小智 12

在第9.4章之后不久我就遇到了集成测试的问题.我的所有控制器测试和请求集成测试都爆炸了"电子邮件已被采取"的消息

我从RailsTutorial中学到的东西 - 第8.4.3章 - 在集成测试中添加用户后,测试数据库没有清除是你需要在集成测试后做一些事情来清理,因为不像单元测试它们可能不会自行清理.

在那里提出的解决方案是使用DatabaseCleaner gem,其实现也在链接的Question中解释.

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