I''ve got a controller which produces an RSS feed, pretty much based on Ryan Bates recent RailsCast. I''m having a heck of a time getting the spec to successfully fetch the feed though. I gave up got it working without a spec, and I''m now trying to back up and get the spec to work. The controller is simplicity itself: class PodcastRssFeedController < ApplicationController def index @podcasts = Podcast.latest(100) end end I have a route which gets to the index action and sets :format => :rss, as I said this produces a valid rss response in the real world, just not in the spec. Here''s the basic spec: require File.dirname(__FILE__) + ''/../spec_helper'' require File.dirname(__FILE__) + ''/../be_valid_feed'' def mock_podcast(i) mock_model( Podcast, :artist_name_slug => "Artist#{i}" ) end describe PodcastRssFeedController do before(:all) do @podcasts = (1..5).map {|i| mock_podcast(i)} Podcast.stub!(:latest).and_return(@podcasts) end describe ''handling GET brightsidepodcasts/rss.xml'' do def do_get @request.format = ''rss'' get ''index'', :format => :rss end it "should successfully get feed" do do_get response.should be_success end it "should validate" do do_get response.should be_valid_feed end end end The validation example is failing because the response body is being returned as podcast_rss_feed/index I''ve tried stepping through with rdebug and I can''t figure out where it''s going wrong. I eventually end up here: 1099 logger.info("Rendering #{template_path}" + (status ? " (#{status})" : '''')) if logger => 1100 render_for_text(@template.render_file(template_path, use_full_path, locals), status) 1101 end 1102 1103 def render_for_text(text = nil, status = nil, append_response = false) #:nodoc: 1104 @performed_render = true /Users/rick/Documents/terralien/brightside/site/vendor/rails/actionpack/lib/action_controller/base.rb:1100 When I s(tep) into this I end up here: 173 @template.metaclass.class_eval do 174 define_method :file_exists? do 175 true 176 end 177 define_method :render_file do |*args| => 178 @first_render ||= args[0] 179 end 180 end 181 end 182 end /Users/rick/Documents/terralien/brightside/site/vendor/plugins/rspec_on_rails/lib/spec/rails/example/controller_example_group.rb:178 It looks like the real ActionView::Base.render_file never gets called and that''s where it looks like the realization that it''s looking for rss rather than say html seems to happen. Can anyone shed any light on this? -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/
On Feb 7, 2008 2:27 PM, Rick DeNatale <rick.denatale at gmail.com> wrote:> I''ve got a controller which produces an RSS feed, pretty much based on > Ryan Bates recent RailsCast. > > I''m having a heck of a time getting the spec to successfully fetch the > feed though. I gave up got it working without a spec, and I''m now > trying to back up and get the spec to work. > > The controller is simplicity itself: > > class PodcastRssFeedController < ApplicationController > > def index > @podcasts = Podcast.latest(100) > end > > end > > I have a route which gets to the index action and sets :format => > :rss, as I said this produces a valid rss response in the real world, > just not in the spec. > > Here''s the basic spec: > > require File.dirname(__FILE__) + ''/../spec_helper'' > require File.dirname(__FILE__) + ''/../be_valid_feed'' > > def mock_podcast(i) > mock_model( > Podcast, > :artist_name_slug => "Artist#{i}" > ) > end > > describe PodcastRssFeedController do > > before(:all) do > @podcasts = (1..5).map {|i| mock_podcast(i)} > Podcast.stub!(:latest).and_return(@podcasts) > end > > describe ''handling GET brightsidepodcasts/rss.xml'' do > > def do_get > @request.format = ''rss'' > get ''index'', :format => :rss > end > > it "should successfully get feed" do > do_get > response.should be_success > end > > it "should validate" do > do_get > response.should be_valid_feed > end > end > > end > > The validation example is failing because the response body is being returned as > podcast_rss_feed/index > > I''ve tried stepping through with rdebug and I can''t figure out where > it''s going wrong. > > I eventually end up here: > > 1099 logger.info("Rendering #{template_path}" + (status ? > " (#{status})" : '''')) if logger > => 1100 render_for_text(@template.render_file(template_path, > use_full_path, locals), status) > 1101 end > 1102 > 1103 def render_for_text(text = nil, status = nil, > append_response = false) #:nodoc: > 1104 @performed_render = true > /Users/rick/Documents/terralien/brightside/site/vendor/rails/actionpack/lib/action_controller/base.rb:1100 > > When I s(tep) into this I end up here: > > 173 @template.metaclass.class_eval do > 174 define_method :file_exists? do > 175 true > 176 end > 177 define_method :render_file do |*args| > => 178 @first_render ||= args[0] > 179 end > 180 end > 181 end > 182 end > /Users/rick/Documents/terralien/brightside/site/vendor/plugins/rspec_on_rails/lib/spec/rails/example/controller_example_group.rb:178 > > It looks like the real ActionView::Base.render_file never gets called > and that''s where it looks like the realization that it''s looking for > rss rather than say html seems to happen. > > Can anyone shed any light on this?Try integrate_views: describe PodcastRssFeedController do integrate_views ... end Without that, render gets modified by rspec (to isolate your controllers from their views). HTH, David> > -- > Rick DeNatale > > My blog on Ruby > http://talklikeaduck.denhaven2.com/ > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
On 2/7/08, David Chelimsky <dchelimsky at gmail.com> wrote:> On Feb 7, 2008 2:27 PM, Rick DeNatale <rick.denatale at gmail.com> wrote: > > I''ve got a controller which produces an RSS feed, pretty much based on > > Ryan Bates recent RailsCast. > > > > I''m having a heck of a time getting the spec to successfully fetch the > > feed though. I gave up got it working without a spec, and I''m now > > trying to back up and get the spec to work.> > Try integrate_views: > > describe PodcastRssFeedController do > integrate_views > ... > end > > Without that, render gets modified by rspec (to isolate your > controllers from their views).Thanks for the quick reply David, that was the problem, athough I found that it needs to go into the nested example group, not the outer one. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/