Rails 3教程第11章“验证失败:已经采取了电子邮件”错误”错误
-
24-10-2019 - |
题
我的麻烦在Ruby on Rails教程的第11章中引起了 这里.
我看到这个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
. 。这真是令人困惑。我认为每次AutoTest RAN RAN RSSPEC时,工厂语句都会在新鲜的测试数据库中生成用户。我用Git从主分支中检查了源文件,然后再次尝试,但看到了同样的错误。因此,我怀疑它与DB内容有关,而不是代码。
所以,我做了以下操作:
restarted "rails s"
restarted autotest
rake db:reset
rake db:migrate
rake db:test:prepare
rake db:populate
...一切都变成绿色。 RSPEC测试通过了。
可能会有更多的“点”解决方案,但是我很激动。希望它能帮助别人。我可以得出结论,我的测试/开发以某种方式为DB增加了一些意外的东西。我想上述步骤是使自己成为第11章结尾附近的新鲜DB的好方法。
是否有更直接的方法来解决这个问题?错误是否表明我没有意识到的其他问题?我认为运行RSPEC并不能保证每次都有新的测试数据库。这是一个错误的假设吗?
解决方案
在第9.4章之后不久,我在集成测试方面遇到了麻烦。我的所有控制器测试和请求集成测试都会随消息“已获取电子邮件”的消息爆炸。
我从中学到了什么 RailStutorial-第8.4.3章 - 在集成测试中添加用户后未清除测试数据库 是您需要在集成测试后做些清洁,因为与单位测试不同,它们可能不会在自己之后清理。
介绍的解决方案是使用 databasecleaner GEM,在链接的问题中也解释了其实现。
我认为,如果您在集成测试后不采取一些清理策略,则每次运行测试套件时,都将继续使用“ shot弹枪”解决方案来清理数据库。绝对不好玩。
其他提示
这对我有用:
bundle exec rake db:test:prepare
它也在教程中。
对我来说,这个问题似乎正在运行。重新启动后,我可以根据需要进行多次测试。
它有所帮助,添加到文件中 factories
sequence(:email) {|n| "person#{n}@example.com" }
就我而言,问题是在电子邮件中等同
factory :user
和
factory :user_with_additional_options