我正在关注Michael Hartl的Ruby on Rails教程(railstutorial.org)。
在某些时候,我厌倦了测试失败只是因为测试使用了旧的缓存版本的类,所以我在测试环境中关闭了config.cache_classes。这解决了这个问题,一切都进行了一段时间。
直到我尝试在第8.4.3章中实现集成测试。此时数据用
输入数据库it "should make a new user" do
lambda do
visit signup_path
fill_in "Name", :with => "Example User"
fill_in "Email", :with => "user@example.com"
fill_in "Password", :with => "foobar"
fill_in "Confirmation", :with => "foobar"
click_button
response.should have_selector("div.flash.success",
:content => "Welcome")
response.should render_template('users/show')
end.should change(User, :count).by(1)
end
每次测试后,都会保留在数据库中,因此只有第一次运行此测试才能运行,之后它会一直失败,直到我手动清空数据库。 除此之外它还有效。 但现在在第9章中,集成测试再次失败:
describe "when signed in" do
before(:each) do
@user = Factory(:user)
visit signin_path
fill_in :email, :with => @user.email
fill_in :password, :with => @user.password
click_button
end
it "should have a signout link" do
visit root_path
response.should have_selector("a", :href => signout_path,
:content => "Sign out")
end
这次它不起作用,用户没有登录,结果页面没有退出链接,只有正常的登录链接。 在webbrowser中测试时,它可以正常工作。
我花了几个小时和几天搜索互联网并测试不同的东西,最后我找到了解决方案:重新启动config.cache_classes。 现在它完美无缺。
所以有人可以向我解释为什么config.cache_classes使测试失败?如何在不弄乱我的测试的情况下关闭缓存?
先谢谢,
最好的问候,托比亚斯
答案 0 :(得分:2)
当您进行Capybara通话时,它会使用机架测试来模拟对rails应用的调用。每次调用完成后,它都会重新加载所有rails类。这意味着你在调用'visit signin_path'之前创建的@user对象没有被删除,因为所有的ActiveRecord对象都已重新加载。
当你将cache-classes设置为true时,它告诉Rack不要在每个请求上重新加载ActiveRecord对象,这样你的测试就会再次通过。
我相信如果你想让上面写的测试通过而不打开缓存类,你应该将'@user = Factory(:user)'行移到'visit signin_path'行下面。
答案 1 :(得分:1)
我有完全相同的问题,就像你将config.cache_classes设置为true解决了问题。但是在测试环境中缓存类真的不是你想要的我想不到的。我当然不明白为什么缓存类会让测试通过。
所以我发现解决这个问题的方法是安装数据库清理,因为测试失败的原因是测试数据库中的重复条目。 https://github.com/bmabey/database_cleaner
然后在您的gem文件中,在 测试组 中添加此内容。
gem 'database_cleaner', '0.6.6'
然后运行“bundle install”来安装这个gem
然后...在您的spec_helper.rb文件中,添加此..
RSpec.configure do |config|
.
.
.
.
config.before(:each) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean
end
这将在每次运行rspec测试之前清除测试数据库。
希望这会有所帮助。 干杯, 标记