Stephen Bannasch
2010-Apr-22 19:29 UTC
[rspec-users] running: ''rake spec'' mixes ApplicationHelper into my ActiveRecord model instances
When I run the a controllers spec test on it''s own I get just what I expect. But when I run the same tests with: rake spec I get some strange errors because ApplicationHelper ends up getting mixed into my ActiveRecord model instances. Is this normal? It seems nutty to me -- maybe it''s a problem just in my codebase. This is a rails 2.3.4 project using these versions of rspec and rspec-rails: $ gem list rspec *** LOCAL GEMS *** rspec (1.3.0) rspec-rails (1.3.2) This gist shows some details of the issue: http://gist.github.com/375634 The code is in the emb-test branch of http://github.com/stepheneb/rigse
Stephen Bannasch
2010-Apr-23 05:32 UTC
[rspec-users] running: ''rake spec'' mixes ApplicationHelper into my ActiveRecord model instances
solved ... Running the ApplicationHelper spec tests mixed the ApplicationHelper methods into Object. Actually I don''t remember making the helper being tested or the spec ;-) Might have been generated by restful authentication ... Here''s what''s in spec/helpers/application_helper_spec.rb (which is what is causing the problem): require File.dirname(__FILE__) + ''/../spec_helper'' include ApplicationHelper include AuthenticatedTestHelper describe ApplicationHelper do describe "title" do it "should set @page_title" do title(''hello'').should be_nil @page_title.should eql(''hello'') end it "should output container if set" do title(''hello'', :h2).should have_tag(''h2'', ''hello'') end end end Evidently self is Object when that file is loaded and mixes the methods in ApplicationHelper into Object -- not useful -- but I''ll bet I''m still doing something wrong ... Here''s what I replaced it with which works fine: require ''spec_helper'' class ViewWithApplicationHelper < ActionView::Base include ApplicationHelper # When actually running in a view the controller''s instance variables are # mixed into the object that is self when rendering, but instances # created from a class that just inherits from ActionView::Base don''t have # those instance variables (like @page_title) mixed in. So I add it by hand. attr_accessor :page_title end describe ViewWithApplicationHelper do before(:each) do @view = ViewWithApplicationHelper.new end describe "title" do it "should set @page_title" do @view.title(''hello'').should be_nil @view.page_title.should eql(''hello'') end it "should output container if set" do @view.title(''hello'', :h2).should have_tag(''h2'', ''hello'') end end end http://gist.github.com/375634 updated with the description of using ruby-debug to find this problem.