7

我的问题出现在Ruby on Rails教程here的第11章中。Rails 3教程第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。这非常令人费解。我认为工厂声明每次自动测试运行rspec时都会在新的测试数据库中生成一个用户。我用git从master分支中检出了源文件,然后再次尝试,但看到了同样的错误。因此,我怀疑它与db内容有关,而不是代码。

所以,我做了以下内容:

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

...而这一切又绿色。 rspec测试通过。

可能有更多的“到了点”的解决方案,但我很高兴这个工作。希望它可以帮助别人。我只能得出结论,我的测试/开发以某种方式向db中添加了一些意想不到的东西。我想上述步骤是一个很好的方法,使自己在第11章结束时的新鲜数据库。

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

+3

有没有任何的问题在这里...这是一个问题=>答案的网站。提出一个问题然后自己回答是完全可以接受的,但是你对此的回答是不正确的:( – nzifnab 2011-03-15 07:00:41

+0

nzifnab you are correct。我的帖子主要是一个声明,不过,我希望对某些人有用我真的接近了一个真正的问题,“如果别人能够在这里发现一些光,我想这也会很好。”我的'解决方案'是一种霰弹枪方法。我仍然不确定哪里出了什么问题,但是对于那些在黑暗中生活的人来说,上面的配方可能是一个方便的解决方案。 – 2011-03-15 14:24:15

+1

我明白你的观点。我可以发布这样的话:“我在第11章中有令人费解的rspec错误....”然后还发表了自己的评论。抱歉。下次。如果当地时间不是凌晨4点,我可能会想到第一次复飞。 P. – 2011-03-15 14:30:22

回答

11

我在第9.4章后不久就遇到了集成测试问题。我所有的控制测试和请求集成测试吹了“电子邮件已经采取”消息

我从RailsTutorial - chapter 8.4.3 - Test database not clearing after adding user in integration test学到的是,你需要做的事情后,集成测试进行清理,因为不像单元测试他们可能无法自行清理。

这里介绍的解决方案是使用DatabaseCleaner宝石,其实现也在链接的问题中解释。

我认为,如果在集成测试之后没有实施一些清理策略,那么每次运行测试套件时都必须使用'shotgun'解决方案来清理数据库。绝对不好玩。

+0

哦。谢谢。这令人迷惑的个人秘密拉开了面纱。这里http://rubydoc.info/gems/database_cleaner/0.6.7/frames似乎确切地说到了这一点。 – 2011-04-24 07:29:52

4

这个工作对我来说:

bundle exec rake db:test:prepare

这也是在本教程。

2

对我来说,这个问题似乎在运行Spork。重新启动后,我可以根据需要多次运行测试。

+1

我也不得不重新启动spork。我通过重新启动我的警卫来完成。但是这并没有解决问题,直到我重新开始运作时,一切都开始为我工作了。谢谢。 – hatunike 2013-09-03 02:38:35

1

它的帮助下,添加到该文件factories

sequence(:email) {|n| "person#{n}@example.com" }