Undefined Method `cache` in Tests for Rails 4.2.5.1
Re: https://github.com/rails/rails/issues/23244
We're running rspec-rails 3.3.3. After updating to Rails 4.2.5.1, we started seeing failures in our tests when calling our method for manually rendering 404 pages. It appears that everything works fine when running the app and accessing that code path in the browser.
Here's a full trace for the failure:
5) RedirectsController#redirect_region without valid region ID responds with a 404
Failure/Error: subject { get :redirect_region, params }
NoMethodError:
undefined method `cache' for nil:NilClass
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/template/resolver.rb:151:in `cached'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/template/resolver.rb:121:in `find_all_anywhere'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/path_set.rb:68:in `block (2 levels) in _find_all'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/path_set.rb:66:in `each'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/path_set.rb:66:in `block in _find_all'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/path_set.rb:65:in `each'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/path_set.rb:65:in `_find_all'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/path_set.rb:50:in `find_file'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/lookup_context.rb:126:in `find_file'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/abstract_renderer.rb:18:in `find_file'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:32:in `block in determine_template'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/lookup_context.rb:147:in `with_fallbacks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/abstract_renderer.rb:18:in `with_fallbacks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:32:in `determine_template'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/template_renderer.rb:8:in `render'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/renderer.rb:42:in `render_template'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/renderer/renderer.rb:23:in `render'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/rendering.rb:100:in `_render_template'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/streaming.rb:217:in `_render_template'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/rendering.rb:83:in `render_to_body'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/rendering.rb:32:in `render_to_body'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/renderers.rb:37:in `render_to_body'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/abstract_controller/rendering.rb:25:in `render'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/rendering.rb:16:in `render'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:44:in `block (2 levels) in render'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/2.2.0/benchmark.rb:303:in `realtime'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/core_ext/benchmark.rb:12:in `ms'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:44:in `block in render'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:87:in `cleanup_view_runtime'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:43:in `render'
# ./app/controllers/application_controller.rb:32:in `render_404'
# ./app/controllers/redirects_controller.rb:37:in `redirect_region'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/abstract_controller/base.rb:198:in `process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/rendering.rb:10:in `process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/abstract_controller/callbacks.rb:20:in `block in process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:117:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:117:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:555:in `block (2 levels) in compile'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:505:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:505:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:92:in `__run_callbacks__'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:778:in `_run_process_action_callbacks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/callbacks.rb:81:in `run_callbacks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/abstract_controller/callbacks.rb:19:in `process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/rescue.rb:29:in `process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:32:in `block in process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:in `block in instrument'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/notifications.rb:164:in `instrument'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/abstract_controller/base.rb:137:in `process'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionview-4.2.5.1/lib/action_view/rendering.rb:30:in `process'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/test_case.rb:639:in `process'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/test_case.rb:67:in `process'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/actionpack-4.2.5.1/lib/action_controller/test_case.rb:514:in `get'
# ./spec/controllers/redirects_controller_spec.rb:45:in `block (3 levels) in <top (required)>'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:295:in `block (2 levels) in let'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:157:in `block (3 levels) in fetch_or_store'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:157:in `fetch'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:157:in `block (2 levels) in fetch_or_store'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/reentrant_mutex.rb:22:in `synchronize'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:156:in `block in fetch_or_store'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:155:in `fetch'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:155:in `fetch_or_store'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/memoized_helpers.rb:295:in `block in let'
# ./spec/controllers/redirects_controller_spec.rb:61:in `block (4 levels) in <top (required)>'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:206:in `instance_exec'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:206:in `block in run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:430:in `block in with_around_and_singleton_context_hooks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:388:in `block in with_around_example_hooks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:478:in `block in run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:618:in `block in run_around_example_hooks_for'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:273:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:273:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-rails-3.3.3/lib/rspec/rails/example/controller_example_group.rb:190:in `block (2 levels) in <module:ControllerExampleGroup>'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:378:in `instance_exec'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:378:in `instance_exec'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:389:in `execute_with'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:620:in `block (2 levels) in run_around_example_hooks_for'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:273:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:273:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-rails-3.3.3/lib/rspec/rails/adapters.rb:127:in `block (2 levels) in <module:MinitestLifecycleAdapter>'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:378:in `instance_exec'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:378:in `instance_exec'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:389:in `execute_with'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:620:in `block (2 levels) in run_around_example_hooks_for'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:273:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:273:in `call'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:621:in `run_around_example_hooks_for'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/hooks.rb:478:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:388:in `with_around_example_hooks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:430:in `with_around_and_singleton_context_hooks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example.rb:203:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:559:in `block in run_examples'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:555:in `map'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:555:in `run_examples'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:521:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:522:in `block in run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:522:in `map'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:522:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:522:in `block in run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:522:in `map'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/example_group.rb:522:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:115:in `block (3 levels) in run_specs'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:115:in `map'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:115:in `block (2 levels) in run_specs'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/configuration.rb:1627:in `with_suite_hooks'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:114:in `block in run_specs'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/reporter.rb:77:in `report'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:113:in `run_specs'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:89:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:73:in `run'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/lib/rspec/core/runner.rb:41:in `invoke'
# /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rspec-core-3.3.2/exe/rspec:4:in `<top (required)>'
# /usr/local/rbenv/versions/2.2.3/bin/rspec:23:in `load'
# /usr/local/rbenv/versions/2.2.3/bin/rspec:23:in `<main>'
And here's the code in question:
FOUR_OH_FOUR_PATH = 'public/404.html'.freeze
def render_404
render status: :not_found, file: FOUR_OH_FOUR_PATH, layout: false
end
cc @jcoyne
since you opened a similar issue on rails/rails.