diff --git a/lib/rspec/rails/example/view_example_group.rb b/lib/rspec/rails/example/view_example_group.rb index 7ac2867083..af9e8b64d2 100644 --- a/lib/rspec/rails/example/view_example_group.rb +++ b/lib/rspec/rails/example/view_example_group.rb @@ -13,6 +13,14 @@ module ViewExampleGroup include RSpec::Rails::ViewAssigns include RSpec::Rails::Matchers::RenderTemplate + # @private + module StubResolverCache + def self.resolver_for(hash) + @resolvers ||= {} + @resolvers[hash] ||= ActionView::FixtureResolver.new(hash) + end + end + # @private module ClassMethods def _default_helper @@ -84,7 +92,7 @@ def view # # stub_template("widgets/_widget.html.erb" => "This content.") def stub_template(hash) - view.view_paths.unshift(ActionView::FixtureResolver.new(hash)) + view.view_paths.unshift(StubResolverCache.resolver_for(hash)) end # Provides access to the params hash that will be available within the diff --git a/spec/rspec/rails/example/view_example_group_spec.rb b/spec/rspec/rails/example/view_example_group_spec.rb index f06d1942bf..567a56dd83 100644 --- a/spec/rspec/rails/example/view_example_group_spec.rb +++ b/spec/rspec/rails/example/view_example_group_spec.rb @@ -254,5 +254,36 @@ def _view; end view_spec.template end end + + describe '#stub_template' do + let(:view_spec_group) do + Class.new do + include ViewExampleGroup::ExampleMethods + def _view + @_view ||= Struct.new(:view_paths).new(['some-path']) + end + end + end + + it 'prepends an ActionView::FixtureResolver to the view path' do + view_spec = view_spec_group.new + view_spec.stub_template('some_path/some_template' => 'stubbed-contents') + + result = view_spec.view.view_paths.first + + expect(result).to be_instance_of(ActionView::FixtureResolver) + expect(result.hash).to eq('some_path/some_template' => 'stubbed-contents') + end + + it 'caches FixtureResolver instances between example groups' do + view_spec_one = view_spec_group.new + view_spec_two = view_spec_group.new + + view_spec_one.stub_template('some_path/some_template' => 'stubbed-contents') + view_spec_two.stub_template('some_path/some_template' => 'stubbed-contents') + + expect(view_spec_one.view.view_paths.first).to eq(view_spec_two.view.view_paths.first) + end + end end end