Rails 3教程第11章“validation失败:已经收到电子邮件”错误
我的麻烦出现在Ruby on Rails Tutorial的第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运行rspec时,工厂语句都在一个新的测试数据库中生成一个用户。 我用git检查了主分支中的源文件并再次尝试,但看到了同样的错误。 因此我怀疑它与db内容有关,而不是代码。
所以,我做了以下事情:
restarted "rails s" restarted autotest rake db:reset rake db:migrate rake db:test:prepare rake db:populate
……一切都变绿了。 rspec测试通过了。
可能有一个更“重要”的解决方案,但我很激动这个工作。 希望它可以帮助别人。 我只能得出结论,我的测试/开发以某种方式在数据库中添加了一些意想不到的东西。 我想上面的步骤是在第11章结尾附近让自己成为新数据库的好方法。
有没有更直接的方法来解决这个问题? 错误是否表明我在没有意识到的情况下解决了其他问题? 我认为运行rspec并不能保证每次都有新的测试数据库。 这是一个错误的假设吗?
在第9.4章之后不久我遇到了集成测试的问题。 我的所有控制器测试和请求集成测试都爆炸了“电子邮件已被采取”的消息
我从RailsTutorial中学到的东西 – 第8.4.3章 – 在集成测试中添加用户后测试数据库没有清除 ,你需要在集成测试后做一些事情来清理,因为与unit testing不同,它们可能不会自行清理。
在那里提出的解决方案是使用DatabaseCleaner gem,其实现也在链接的Question中解释。
我认为,如果您在集成测试后没有实施某些清理策略,那么每次运行测试套件时,您将继续使用“霰弹枪”解决方案来清理数据库。 绝对不好玩。
这对我有用:
bundle exec rake db:test:prepare
它也在教程中。
对我来说,这个问题似乎正在运行Spork。 重新启动后,我可以根据需要多次运行测试。
它帮助,添加到文件factories
sequence(:email) {|n| "person#{n}@example.com" }
在我的情况下问题是在等于电子邮件中
factory :user
和
factory :user_with_additional_options
- 为什么我的RSpec测试失败,但我的应用程序正在运行?
- 未初始化的常量ApplicationRecord
- Rails教程sample_app在Heroku中失败,带有log:ActionController :: RoutingError(没有路由匹配“/ about”):
- Rails找不到已安装的gem
- 为什么在保存对象后使用’reload’方法? (Hartl Rails Tut 6.30)
- 如何将image_tag与bootstrap类一起使用:“img-responsive”? 第11章
- AWS S3 IAM策略,用于对单个存储桶执行读写权限
- Rails教程 – 9.3.3 Current_User
- Rails教程Ch。 9练习6:预期的响应为,但