9

我的麻烦出现在 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 并不能保证每次都有新的测试数据库。这是一个错误的假设吗?

4

5 回答 5

12

在第 9.4 章之后不久,我在集成测试中遇到了麻烦。我所有的控制器测试和请求集成测试都出现了“电子邮件已被占用”的消息

我从RailsTutorial - 第 8.4.3 章 - 在集成测试中添加用户后未清除测试数据库中学到的是,您需要在集成测试后做一些清理工作,因为与单元测试不同,它们可能不会自行清理。

那里提出的解决方案是使用DatabaseCleaner gem,链接问题中也解释了其实现。

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

于 2011-04-24T03:32:26.770 回答
4

这对我有用:

bundle exec rake db:test:prepare

它也在教程中。

于 2012-11-17T00:03:57.763 回答
2

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

于 2013-03-30T20:17:57.300 回答
1

它有帮助,添加到文件中factories

sequence(:email) {|n| "person#{n}@example.com" }
于 2014-01-17T01:55:08.273 回答
-1

在我的情况下,问题在于等于电子邮件

factory :user

factory :user_with_additional_options
于 2018-06-13T08:23:52.900 回答