Problems testing rss feed controller

I’ve got a controller which produces an RSS feed, pretty much based on
Ryan B. 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 [email protected] wrote:

Here’s the basic spec:

  @request.format = 'rss'
  response.should be_valid_feed

1104 @performed_render = true
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

On 2/7/08, David C. [email protected] wrote:

On Feb 7, 2008 2:27 PM, Rick DeNatale [email protected] wrote:

I’ve got a controller which produces an RSS feed, pretty much based on
Ryan B. 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/