我目前正在研究Michael Hartl的Ruby on Rails教程并完成了第8章。(顺便提一下教程非常喜欢!)完成第8章后,我遇到了一个问题:最后的集成测试在users_spec.rb中,在第一次运行时成功,但在SECOND上失败。 (你可以看到我在这里引用的代码部分 - > http://ruby.railstutorial.org/chapters/sign-up#sec:successful_signup控制台中显示的错误是:
1) Users signup success should make a new user
Failure/Error: response.should have_selector('div.flash.success',...
然而,当向下看所有吐出的红色HTML时,我发现了这个:
<div id="error_explanation">
<h2>1 error
prevented this user from being saved.</h2>
<p>There were problems with the following fields:</p>
<ul>
<li>Email has already been taken</li>
</ul>
</div>
因此,在我看来,测试运行一次,然后失败的原因是用户在第二次运行时仍然在测试数据库中,因此由于重复的电子邮件导致验证失败。我可以通过在每次尝试后更改测试中的电子邮件来验证这一点。只要我给它发送一封新电子邮件,测试就不会失败。
在尝试进一步排除故障时,我从GitHub克隆了教程代码并设置了应用程序。测试运行良好。我可以运行整个套件,或者只运行users_spec.rb多次 - 没问题。实际上,说实话,(而且我知道这看起来很奇怪)GitHub的代码在同一个电子邮件重复错误的情况下确实失败了几次,但是在我休息测试数据库后它运行正常。相信我,我也在我的应用程序中做到了这一点,但我仍然有同样的问题。是的,我直接从书中复制并粘贴了测试代码,也从工作的GitHub代码中复制并粘贴,以便清除错别字。没有交易。
似乎user_spec.rb文件本身之外的某些东西导致了问题,但我似乎无法找到它。我希望继续学习本教程,但目前我已经陷入困境。任何帮助将不胜感激!
答案 0 :(得分:4)
也许请查看config.cache_classes
中的config/environments/test.rb
行并确保其为true
。您还可以尝试使用factory sequence来解决问题。
答案 1 :(得分:0)
听起来您需要确保在spec_helper.rb中,您在运行之间清理数据库。您的users_spec假设电子邮件不存在,并且您的用户验证确保它是唯一的。
这是一个不错的解决方案:https://github.com/bmabey/database_cleaner