我的麻烦出现在 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 运行 rspec 时,工厂语句都会在新的测试数据库中生成一个用户。我用 git 从 master 分支检查了源文件并再次尝试,但看到了同样的错误。因此,我怀疑它与数据库内容有关,而不是代码。
所以,我做了以下事情:
restarted "rails s"
restarted autotest
rake db:reset
rake db:migrate
rake db:test:prepare
rake db:populate
......一切都变绿了。rspec 测试通过。
可能有一个更“切中要害”的解决方案,但我很高兴这能奏效。希望它可以帮助别人。我只能得出结论,我的测试/开发以某种方式向数据库添加了一些意想不到的东西。我想上述步骤是在第 11 章快结束时让自己成为一个新鲜数据库的好方法。
有没有更直接的方法来解决这个问题?该错误是否表明我在没有意识到的情况下解决了其他问题?我认为运行 rspec 并不能保证每次都有新的测试数据库。这是一个错误的假设吗?