我的麻烦在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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top