【问题标题】:config.cache_classes = false messing up rspec tests?config.cache_classes = false 搞砸 rspec 测试?
【发布时间】:2013-08-13 22:13:20
【问题描述】:

我正在关注 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

这一次它不起作用,用户没有登录,结果页面没有退出链接,只有正常的登录链接。 在网络浏览器中进行测试时,它可以正常工作。

我花了几个小时和几天的时间搜索互联网并测试不同的东西,最后我找到了解决方案:重新打开 config.cache_classes。 现在它可以完美运行了。

那么谁能向我解释为什么 config.cache_classes 会导致测试失败?我怎样才能在不搞乱我的测试的情况下关闭缓存?

提前致谢,

最好的问候,托拜厄斯

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    当您调用 Capybara 时,它会使用 rack-test 来模拟对 rails 应用程序的调用。每次调用完成时,它都会重新加载所有 Rails 类。这意味着您在调用 'visit signin_path' 之前创建的 @user 对象将变为 nil,因为所有 ActiveRecord 对象都已重新加载。

    当你将 cache-classes 设置为 true 时,它​​告诉 Rack 不要在每个请求上重新加载 ActiveRecord 对象,这样你的测试就会再次通过。

    我相信,如果您希望在不打开缓存类的情况下通过上面编写的测试,您应该将“@user = Factory(:user)”行移到“visit signin_path”行下方。

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题,就像您将 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 测试之前清除您的测试数据库。

      希望这会有所帮助。 干杯, 标记。

      【讨论】:

        猜你喜欢
        • 2013-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 2010-10-15
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多