ruby-on-rails – config.cache_classes = false搞砸了rspec测试?

我正在关注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使测试失败?如何在不弄乱我的测试的情况下关闭缓存?

提前致谢,

最好的问候,托比亚斯

最佳答案 我有完全相同的问题,就像你将config.cache_classes设置为true解决了这个问题.但是在测试环境中缓存类真的不是你想要的我想不到的.我当然不明白为什么缓存类会让测试通过.

因此,我发现解决此问题的方法是安装数据库清理,因为测试失败的原因是测试数据库中的重复条目. https://github.com/bmabey/database_cleaner

然后在你的gemfile中,在你的测试组中添加它.

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测试之前清除测试数据库.

希望这可以帮助.
干杯,
标记.

点赞