1

我正在将应用程序从 Ruby 1.9.2 上的 Rails 3.1 升级到 Ruby 1.9.3 上的 Rails 3.2。当我逐步浏览正在开发的应用程序时,一切似乎都很好。我对 rake test:units 没有任何问题。

但是当我运行 rake test:functionals 时,我的一个控制器中出现“堆栈级别太深错误”。

只为那个控制器运行测试,一切都很好:

ruby -Itest test/functional/administrators_controller_test.rb 

这是完整的错误文本(我已经安装了稍微漂亮的输出):

ERROR (0:00:00.012) comes first
      stack level too deep
    @ /usr/local/rvm/gems/ruby-1.9.3-p194@rails-3.2/gems/actionpack-3.2.8/lib/abstract_controller/layouts.rb:358

我确定我只是个白痴,但我对如何从框架内部获取堆栈跟踪一无所知。运行 rake test:functionals --trace 会产生相同的错误和相同的输出。我还将 config.log_level 更改为 :debug,并且取消了 Rails.backtrace_cleaner.remove_silencers 的注释!在 config/initializers/backtrace_silencers.rb 中。

我可以运行其他 rake 任务,并且 rake test:units 通过了所有测试。

有人有线索吗?我可以用一个。

4

1 回答 1

1

所以,事实证明这是我的 ActionMailer 功能测试的问题。在以前的 Rails 版本中,我需要包含 URL 助手:

# test/functional/notifier_test.rb
include Rails.application.routes.url_helpers

class NotifierTest < ActionMailer::TestCase
  test "test new user email" do
  #...
  end
end

当我通过 ruby​​ 一次运行一项功能测试时,我最终发现 Notifier 因堆栈级别太深错误而失败;没有其他单独的测试运行有这个问题。但是在运行 rake test:functionals 时,它们出现了问题。

注释掉包含行解决了所有功能测试中的问题。我仍然不完全确定为什么,除了我猜幕后发生了一些神奇的回调。

于 2012-09-20T15:39:01.027 回答