Skip to content

Commit 47134af

Browse files
authored
Merge pull request #1979 from urbanautomaton/cache-stub-template-resolvers
Cache ActionView::FixtureResolvers created by stub_template
2 parents 0dd9d2c + 3666c35 commit 47134af

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

lib/rspec/rails/example/view_example_group.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ module ViewExampleGroup
1313
include RSpec::Rails::ViewAssigns
1414
include RSpec::Rails::Matchers::RenderTemplate
1515

16+
# @private
17+
module StubResolverCache
18+
def self.resolver_for(hash)
19+
@resolvers ||= {}
20+
@resolvers[hash] ||= ActionView::FixtureResolver.new(hash)
21+
end
22+
end
23+
1624
# @private
1725
module ClassMethods
1826
def _default_helper
@@ -84,7 +92,7 @@ def view
8492
#
8593
# stub_template("widgets/_widget.html.erb" => "This content.")
8694
def stub_template(hash)
87-
view.view_paths.unshift(ActionView::FixtureResolver.new(hash))
95+
view.view_paths.unshift(StubResolverCache.resolver_for(hash))
8896
end
8997

9098
# Provides access to the params hash that will be available within the

spec/rspec/rails/example/view_example_group_spec.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,5 +254,36 @@ def _view; end
254254
view_spec.template
255255
end
256256
end
257+
258+
describe '#stub_template' do
259+
let(:view_spec_group) do
260+
Class.new do
261+
include ViewExampleGroup::ExampleMethods
262+
def _view
263+
@_view ||= Struct.new(:view_paths).new(['some-path'])
264+
end
265+
end
266+
end
267+
268+
it 'prepends an ActionView::FixtureResolver to the view path' do
269+
view_spec = view_spec_group.new
270+
view_spec.stub_template('some_path/some_template' => 'stubbed-contents')
271+
272+
result = view_spec.view.view_paths.first
273+
274+
expect(result).to be_instance_of(ActionView::FixtureResolver)
275+
expect(result.hash).to eq('some_path/some_template' => 'stubbed-contents')
276+
end
277+
278+
it 'caches FixtureResolver instances between example groups' do
279+
view_spec_one = view_spec_group.new
280+
view_spec_two = view_spec_group.new
281+
282+
view_spec_one.stub_template('some_path/some_template' => 'stubbed-contents')
283+
view_spec_two.stub_template('some_path/some_template' => 'stubbed-contents')
284+
285+
expect(view_spec_one.view.view_paths.first).to eq(view_spec_two.view.view_paths.first)
286+
end
287+
end
257288
end
258289
end

0 commit comments

Comments
 (0)