Rails 3.2.1: вызов неопределенного метода в представлении приводит к зависанию теста на 30+ секунд - PullRequest
2 голосов
/ 09 февраля 2012

Я обновляю свое приложение с 3.0.9 до 3.2.1 (ruby 1.9.3-p0, rvm, bundler), и одна вещь, которую я пока не смог отследить, это эта проблема. У меня есть спецификация контроллера (в спецификации / контроллеры), которая отображает представления для каждого примера. Шаблон, который он отображает, может иметь любой неопределенный метод (например, вызов «- blahblah» в хамле), и это приводит к зависанию теста более 30 секунд. Вот ошибка:

undefined local variable or method `blahblahblah' for #<#<Class:0x007fa84f76cc90>:0x007fa849c578c8>

Я запустил отладчик, и зависание произошло при попытке записать саму ошибку. Это происходит в activesupport-3.2.1/lib/active_support/notifications/instrumenter.rb line 22. Так это вина Rails, ошибки Хамла или какой-то другой библиотеки?

Вот мой Gemfile на случай, если что-то, что я использую, может быть проблемой:

source 'http://rubygems.org'
source 'http://gems.github.com'
source 'http://gemcutter.org'

gem 'rails', '3.2.1'
gem 'rake', '~> 0.9.2.2'
gem 'mysql2', '~> 0.3.11'
gem 'htmldoc'
gem 'haml', '~> 3.1.4'
gem 'sass', '~> 3.1.4'
gem 'hpricot'
gem 'curb'
gem 'mini_magick'
gem 'liquid', '~> 2.3.0'
gem 'httparty', '~> 0.8.1'
gem 'linkedin', '0.1.7', :require => 'linkedin'
gem 'twitter', '~> 2.0.2', :require => 'twitter'
gem 'mime-types', '>=1.16', :require => 'mime/types'
gem 'oauth'
gem 'roxml'
gem 'nokogiri'
gem 'sax-machine'
gem 'googlecharts', '1.6.7', :require => 'gchart'
gem 'pdf-reader', '~> 0.9.0'
gem 'paper_trail'
gem 'rubyzip', '0.9.4', :require => 'zip/zip'
gem 'activemerchant', '~> 1.20.2', :require => 'active_merchant'
gem 'compass', '~> 0.11.5'
gem 'compass-rgbapng', '0.1.1', :require => 'rgbapng'
gem 'fancy-buttons', '~> 1.1.1'
gem 'ruby-openid'
gem 'RedCloth', '~> 4.2.9'
gem 'koala', '~> 1.0.0'
gem 'scoped_search', '~> 2.3.6'
gem 'wicked_pdf', '0.7.0'
gem 'devise', '~> 2.0.0'
gem 'paperclip', '~> 2.5.0'
gem 'aws-sdk' # required for paperclip
gem 'whois', '~> 2.0.4'
gem 'validates_timeliness', '~> 3.0.8'
gem 'will_paginate', '~> 3.0.2'
gem 'hoptoad_notifier', '~> 2.4.11'
gem 'savon', '~> 0.9.2'
gem 'escape_utils'
gem 'ajaxful_rating', '3.0.0.beta3'
gem 'acts_as_list', '~> 0.1.3'
gem 'despamilator', '~> 2.0'
gem 'prawn', '~> 0.12.0', :submodules => true
gem 'net-dns', '~> 0.6.1'
gem 'authlogic', '~> 3.1.0'
gem 'myspaceid-sdk', '~> 0.1.11', :require => 'myspace'
gem 'in_place_editing', '~> 1.1.2'
gem 'deadlock_retry', '~> 1.1.2'
gem 'query_trace', '~> 0.1.1'
gem 'aasm', '~> 3.0.2'
gem 'vanity', '~> 1.7.1'
gem 'prototype-rails', '~> 3.2.1'

group :development, :test do
  gem 'rspec-rails', '~> 2.8.1'
  gem 'rspec'

  # one-liner to install these properly: bash < <(curl -L https://raw.github.com/gist/1333785)
  gem 'linecache19', '0.5.13'
  gem 'ruby-debug-base19', '0.11.26'

  gem 'capistrano'
end

group :test do
  gem 'factory_girl_rails'
  gem 'syntax'
  gem 'timecop', '~> 0.3.5'
  gem 'capybara'
  gem 'database_cleaner'
  gem 'cucumber-rails', '~> 1.2.1'
  gem 'cucumber'
  gem 'launchy'
end

Спасибо!

1 Ответ

3 голосов
/ 11 февраля 2012

Я нашел ответ на этот вопрос в трекере Rails на Github (на данный момент это все еще открытая ошибка). Проблема оказалась в том, что при возникновении ошибки проверялся экземпляр ActionDispatch::Routing::RouteSet, что, очевидно, заставляло объект проверять каждый предмет, на котором он держался. Таким образом, чем больше RouteSet, тем больше времени занимает #inspect. Вот исправление:

module ActionDispatch
  module Routing
    class RouteSet
      alias inspect to_s
    end
  end
end

Подробнее об ошибке см. Здесь .

...