Controller specs erroneously loading views in edge rails?

Hello,

I think I may have found a bug between rspec and edge rails… But I’m
new to this so I’m hoping someone else can confirm before I go filing
bug reports.

Basically, I’m seeing what “appears” to be my controller specs
deciding to load the views, even though I haven’t called
integrate_views. When I generate a default rspec_scaffold, the specs
fail with an ActionView::TemplateError:

% script/generate rspec_scaffold Bike name:string sku:string

rake spec

Mock ‘Bike_1017’ received unexpected message :name with (no args)
On line #11 of app/views/index.html.erb

If I modify the generated index spec like this, the spec passes:

…snip…

it “should expose all bikes as @bikes” do
Bike.should_receive(:find).with(:all).and_return([mock_bike])

adding these lines cause the spec to pass…

mock_bike.should_receive(:name)
mock_bike.should_receive(:sku)

get :index
assigns[:bikes].should == [mock_bike]
end
…snip…

While this “fixes” the failures, it’s no longer an isolated test of
the controller.

After spending some time with git-bisect, it looks like this problem
was introduced in a commit to edge rails:

The default rspec_scaffold tests pass before this commit, and fail
after this commit.

More details here:

Am I insane? Or does this happen for anyone else? :slight_smile:

Thanks,
– John R.

Trying to port an existing app to current Rails edge I’ve seen similar
things yesterday. I’ve also updated RSpec/Rails to recent edge.

Here are two workarounds I’ve come up with for two of the problems.
I’m not sure if they cause other problems themselves, but maybe
they’re still useful as a hint.

http://pastie.org/private/5ueehxiqhdgok0d8udksa

I don’t feel familiar enough with RSpec’s guts to provide a patch.

#render_partial on ActionView::Base seems to break because the method
signature has changed.
#render on ControllerExampleGroup seems to break because #render_file
apparently has been removed.

On 23.08.2008, at 00:30, John R. wrote:

it “should expose all bikes as @bikes” do

More details here:
http://rubyforge.org/mailman/listinfo/rspec-users

sven fuchs [email protected]
artweb design http://www.artweb-design.de
grünberger 65 + 49 (0) 30 - 47 98 69 96 (phone)
d-10245 berlin + 49 (0) 171 - 35 20 38 4 (mobile)

There are a number of changes to action pack recently that are
incompatible with rspec. Please report these to lighthouse.

Thanks,
David

On Aug 23, 9:28 am, “David C.” [email protected] wrote:

There are a number of changes to action pack recently that are
incompatible with rspec. Please report these to lighthouse.

I’m assuming you mean rspec’s lighthouse, not rails’? :slight_smile:

– John R.

On Sat, Aug 23, 2008 at 12:44 PM, John R. [email protected]
wrote:

On Aug 23, 9:28 am, “David C.” [email protected] wrote:

There are a number of changes to action pack recently that are
incompatible with rspec. Please report these to lighthouse.

I’m assuming you mean rspec’s lighthouse, not rails’? :slight_smile:

Right.

Ok, done.

http://rspec.lighthouseapp.com/projects/5645-rspec/tickets/508-recent-changes-in-actionpack-break-controller-specs

Thanks!

On 23.08.2008, at 16:28, David C. wrote:

things yesterday. I’ve also updated RSpec/Rails to recent edge.

fail with an ActionView::TemplateError:
…snip…

end

[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users


sven fuchs [email protected]
artweb design http://www.artweb-design.de
grünberger 65 + 49 (0) 30 - 47 98 69 96 (phone)
d-10245 berlin + 49 (0) 171 - 35 20 38 4 (mobile)

Hi guys,

After updating to edge rails I’ve just struck this problem too. I’ve
just
grabbed fresh updates of rspec, rspec-rails, and rails and I’m receiving
a
few controller spec failures related to view rendering when views
shouldn’t
be rendered (failures relate to mock objects not having expected
attributes
and methods).

I’ve logged this in lighthouse →
http://rspec.lighthouseapp.com/projects/5645-rspec/tickets/516

Here’s a copy of the full backtrace of one of the fails:

vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:376:in
`raise_named_route_error’

vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:340:in
generate' vendor/rails/actionpack/lib/action_controller/url_rewriter.rb:208:in rewrite_path’
vendor/rails/actionpack/lib/action_controller/url_rewriter.rb:187:in
rewrite_url' vendor/rails/actionpack/lib/action_controller/url_rewriter.rb:165:in rewrite’
vendor/rails/actionpack/lib/action_controller/base.rb:630:in
url_for' vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb:85:in send’
vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb:85:in
url_for' (eval):15:in user_path’

vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:111:in
`send

vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:111:in
`polymorphic_url’

vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:118:in
polymorphic_path' vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb:91:in url_for’
vendor/rails/actionpack/lib/action_view/helpers/url_helper.rb:228:in
link_to' app/views/home/index.html.erb:5 app/views/home/index.html.erb:4:in each’
app/views/home/index.html.erb:4
vendor/rails/actionpack/lib/action_view/renderable.rb:35:in send' vendor/rails/actionpack/lib/action_view/renderable.rb:35:in render’
vendor/rails/actionpack/lib/action_view/template.rb:68:in
render_template' vendor/rails/actionpack/lib/action_view/base.rb:266:in orig_render’

vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_view/base.rb:26:in
render' vendor/rails/actionpack/lib/action_view/base.rb:369:in _render_with_layout’
vendor/rails/actionpack/lib/action_view/base.rb:260:in `orig_render’

vendor/plugins/rspec-rails/lib/spec/rails/extensions/action_view/base.rb:26:in
render' vendor/rails/actionpack/lib/action_controller/base.rb:1118:in render_for_file’
vendor/rails/actionpack/lib/action_controller/base.rb:881:in
render_without_benchmark' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:51:in render’
vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:8:in
realtime' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:51:in render’

vendor/plugins/rspec-rails/lib/spec/rails/example/controller_example_group.rb:213:in
render' vendor/rails/actionpack/lib/action_controller/base.rb:853:in render_without_benchmark’
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:51:in
render' vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:8:in realtime’
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:51:in
`render’

vendor/plugins/rspec-rails/lib/spec/rails/example/controller_example_group.rb:213:in
render' vendor/rails/actionpack/lib/action_controller/base.rb:1170:in default_render’
vendor/rails/actionpack/lib/action_controller/base.rb:1176:in
perform_action_without_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:617:in call_filters’
vendor/rails/actionpack/lib/action_controller/filters.rb:610:in
perform_action_without_benchmark' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue’

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:293:in
measure' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in perform_action_without_rescue’
vendor/rails/actionpack/lib/action_controller/rescue.rb:202:in
perform_action_without_caching' vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in perform_action’

vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:48:in
cache' vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in cache’
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in
perform_action' vendor/rails/actionpack/lib/action_controller/base.rb:535:in send’
vendor/rails/actionpack/lib/action_controller/base.rb:535:in
`process_without_filters’

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in
synchronize' vendor/rails/actionpack/lib/action_controller/base.rb:535:in process_without_filters’
vendor/rails/actionpack/lib/action_controller/filters.rb:606:in
`process_without_session_management_support’

vendor/rails/actionpack/lib/action_controller/session_management.rb:130:in
process_without_test' vendor/rails/actionpack/lib/action_controller/test_process.rb:18:in process’
vendor/rails/actionpack/lib/action_controller/test_process.rb:400:in
process' vendor/rails/actionpack/lib/action_controller/test_process.rb:371:in get’
controllers/home_controller_spec.rb:12
vendor/plugins/rspec/lib/spec/example/example_methods.rb:83:in
instance_eval' vendor/plugins/rspec/lib/spec/example/example_methods.rb:83:in eval_block’
vendor/plugins/rspec/lib/spec/example/example_methods.rb:21:in
`execute’

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/timeout.rb:48:in
timeout' vendor/plugins/rspec/lib/spec/example/example_methods.rb:18:in execute’
vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:305:in
execute_examples' vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:304:in each’
vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:304:in
execute_examples' vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:132:in run’
vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:22:in
run' vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in each’
vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in
run' vendor/plugins/rspec/lib/spec/runner/options.rb:115:in run_examples’
vendor/plugins/rspec/lib/spec.rb:21:in run' vendor/plugins/rspec/lib/spec/runner.rb:192:in register_at_exit_hook’
controllers/home_controller_spec

Ian W. has just submitted a patch for this. Thanks Ian.
http://rspec.lighthouseapp.com/projects/5645-rspec/tickets/516

Tim.