From 3ec8ddd0cf3851fd0abfc45fd430b0de19981547 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 17 Aug 2020 10:22:57 -0700 Subject: [PATCH] Avoid module_eval on helpers from AV::TestCase Previously we were using module_eval to manually add some helpers in ActionView::TestCase, which assumes a lot about what _helpers allows. Instead, we can use a standard helper block to define these methods only one time, and add a method to the new uniq controller class to tie back to the test instance. --- actionview/lib/action_view/test_case.rb | 36 ++++++++++--------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/actionview/lib/action_view/test_case.rb b/actionview/lib/action_view/test_case.rb index 3aa6af0893..c93cf64d6e 100644 --- a/actionview/lib/action_view/test_case.rb +++ b/actionview/lib/action_view/test_case.rb @@ -102,7 +102,8 @@ module ActionView end def setup_with_controller - @controller = Class.new(ActionView::TestCase::TestController).new + controller_class = Class.new(ActionView::TestCase::TestController) + @controller = controller_class.new @request = @controller.request @view_flow = ActionView::OutputFlow.new # empty string ensures buffer has UTF-8 encoding as @@ -110,8 +111,8 @@ module ActionView @output_buffer = ActiveSupport::SafeBuffer.new "" @rendered = +"" - make_test_case_available_to_view! - say_no_to_protect_against_forgery! + test_case_instance = self + controller_class.define_method(:_test_case) { test_case_instance } end def config @@ -161,6 +162,16 @@ module ActionView included do setup :setup_with_controller ActiveSupport.run_load_hooks(:action_view_test_case, self) + + helper do + def protect_against_forgery? + false + end + + def _test_case + controller._test_case + end + end end private @@ -169,25 +180,6 @@ module ActionView Nokogiri::HTML::Document.parse(@rendered.blank? ? @output_buffer : @rendered).root end - def say_no_to_protect_against_forgery! - _helpers.module_eval do - silence_redefinition_of_method :protect_against_forgery? - def protect_against_forgery? - false - end - end - end - - def make_test_case_available_to_view! - test_case_instance = self - _helpers.module_eval do - unless private_method_defined?(:_test_case) - define_method(:_test_case) { test_case_instance } - private :_test_case - end - end - end - module Locals attr_accessor :rendered_views