Skip to content

Commit 9aeb1de

Browse files
authored
Merge pull request rails#51093 from seanpdoyle/action-view-rendered-memoization
Action View Test Case `rendered` memoization
2 parents dd6f3e1 + 01502fe commit 9aeb1de

File tree

3 files changed

+25
-29
lines changed

3 files changed

+25
-29
lines changed

actionview/lib/action_view/test_case.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ module Behavior
6060
include ActiveSupport::Testing::ConstantLookup
6161

6262
delegate :lookup_context, to: :controller
63-
attr_accessor :controller, :request, :output_buffer
63+
attr_accessor :controller, :request, :output_buffer, :rendered
6464

6565
module ClassMethods
6666
def inherited(descendant) # :nodoc:
@@ -223,7 +223,7 @@ def setup_with_controller
223223
@request = @controller.request
224224
@view_flow = ActionView::OutputFlow.new
225225
@output_buffer = ActionView::OutputBuffer.new
226-
@rendered = +""
226+
@rendered = self.class.content_class.new(+"")
227227

228228
test_case_instance = self
229229
controller_class.define_method(:_test_case) { test_case_instance }
@@ -243,6 +243,9 @@ def rendered_views
243243
@_rendered_views ||= RenderedViewsCollection.new
244244
end
245245

246+
##
247+
# :method: rendered
248+
#
246249
# Returns the content rendered by the last +render+ call.
247250
#
248251
# The returned object behaves like a string but also exposes a number of methods
@@ -290,9 +293,6 @@ def rendered_views
290293
#
291294
# assert_pattern { rendered.json => { title: "Hello, world" } }
292295
# end
293-
def rendered
294-
@_rendered ||= self.class.content_class.new(@rendered)
295-
end
296296

297297
def _routes
298298
@controller._routes if @controller.respond_to?(:_routes)

actionview/test/template/test_case_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,26 @@ class RenderedViewContentTest < ActionView::TestCase
394394
assert_match(/#{developer.name}/, rendered)
395395
assert_includes rendered, developer.name
396396
end
397+
398+
test "#rendered resets after each render" do
399+
render "developers/developer", developer: DeveloperStruct.new("first")
400+
401+
assert_includes rendered, "first"
402+
assert_not_includes rendered, "second"
403+
assert_not_includes rendered, "third"
404+
405+
render "developers/developer", developer: DeveloperStruct.new("second")
406+
407+
assert_includes rendered, "first"
408+
assert_includes rendered, "second"
409+
assert_not_includes rendered, "third"
410+
411+
render "developers/developer", developer: DeveloperStruct.new("third")
412+
413+
assert_includes rendered, "first"
414+
assert_includes rendered, "second"
415+
assert_includes rendered, "third"
416+
end
397417
end
398418

399419
class HTMLParserTest < ActionView::TestCase

guides/source/upgrading_ruby_on_rails.md

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -283,30 +283,6 @@ const fileInputSelector = Rails.fileInputSelector
283283
Rails.fileInputSelector(...)
284284
```
285285

286-
### `ActionView::TestCase#rendered` no longer returns a `String`
287-
288-
Starting from Rails 7.1, `ActionView::TestCase#rendered` returns an object that
289-
responds to various format methods (for example, `rendered.html` and
290-
`rendered.json`). To preserve backward compatibility, the object returned from
291-
`rendered` will delegate missing methods to the `String` rendered during the
292-
test. For example, the following [assert_match][] assertion will pass:
293-
294-
```ruby
295-
assert_match(/some content/i, rendered)
296-
```
297-
298-
However, if your tests rely on `ActionView::TestCase#rendered` returning an
299-
instance of `String`, they will fail. To restore the original behavior, you can
300-
override the `#rendered` method to read from the `@rendered` instance variable:
301-
302-
```ruby
303-
# config/initializers/action_view.rb
304-
305-
ActiveSupport.on_load :action_view_test_case do
306-
attr_reader :rendered
307-
end
308-
```
309-
310286
### `Rails.logger` now returns an `ActiveSupport::BroadcastLogger` instance
311287

312288
The `ActiveSupport::BroadcastLogger` class is a new logger that allows to broadcast logs to different sinks (STDOUT, a log file...) in an easy way.

0 commit comments

Comments
 (0)