On Jun 16, 2008, at 9:19 PM, Andrew Selder wrote:

I updated the spec to look like this:

   it "should render show template" do
     do_get
controller.stub_render(:partial => "/properties/ map_info_box", :object => anything())
     response.should render_template('show')
   end

and I still get the same failure and back trace.

In addition to not working, the problem with stubbing out that render to string is that I can't then check for the presence of those strings in the final output.

Well, therein lies the real problem :) This action is exhibiting a number of code smells. I don't know how familiar you might be w/ that, but:

Long Method - a method that does too many things (I count at least 10)
  Feature Envy - one one object is doing work on another object's data

There's also a lot of asking, violating the Tell Don't Ask principle.

This block:

  @props.each do |prop|
    coords = prop.latlng
    unless coords.lat == 0 || coords.lng == 0
prop.info_box = render_to_string(:partial => "/properties/ map_info_box", :object => prop)
      mark = prop.has_photos? ? "green" : "red"
marker = GMarker.new(coords, :title => prop_help.bubble_header(prop),\
        :info_window => prop.info_box, :icon => Variable.new(mark))
      @map.overlay_init marker
      @markers << marker
    end
  end

.. could become:

  @props.each do |prop|
    @markers << prop.generate_marker if prop.needs_marker?
  end

Much simpler to test at that point! I'd recommend heading down that path.

HTH,
David



Thanks,

Andrew

On Jun 16, 2008, at 10:03 PM, David Chelimsky wrote:

On Jun 16, 2008, at 8:59 PM, Andrew Selder wrote:

Here's the back trace

1)
'SearchesController handling GET /searches/1 should render show template' FAILED
expected "show", got "properties/_map_info_box"
/Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/expectations.rb:52:in `fail_with' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/expectations/handler.rb:25:in `handle_matcher' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/expectations/extensions/object.rb:31:in `should'
./spec/controllers/searches_controller_spec.rb:26:
/Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_methods.rb:84:in `instance_eval' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_methods.rb:84:in `run_with_description_capturing' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_methods.rb:21:in `execute'
/opt/local/lib/ruby/1.8/timeout.rb:48:in `timeout'
/Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_methods.rb:18:in `execute' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_group_methods.rb:303:in `execute_examples' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_group_methods.rb:302:in `each' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_group_methods.rb:302:in `execute_examples' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/example/example_group_methods.rb:130:in `run' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/runner/example_group_runner.rb:22:in `run' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/runner/example_group_runner.rb:21:in `each' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/runner/example_group_runner.rb:21:in `run' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/runner/options.rb:106:in `run_examples' /Users/aselder/BostonLogic/one_system/vendor/plugins/rspec/lib/ spec/runner/command_line.rb:19:in `run'
script/spec:4:

And here's the controller action:

def show
 @search = Search.find(params[:id])
 if @search.too_many_results?
message_to_new "Your search returned too many results ([EMAIL PROTECTED] }). Please narrow your criteria and search again."
   return
 elsif @search.no_results?
message_to_new "Your search returned no results. Please change your criteria and search again."
   return
 end
 init_map
 @props = @search.do_search
 @markers = []
 @props.each do |prop|
   coords = prop.latlng
   unless coords.lat == 0 || coords.lng == 0
prop.info_box = render_to_string(:partial => "/properties/ map_info_box", :object => prop)

This is the line that's causing you trouble. Try stubbing this one out as well:

response.stub_render(:partial => "/properties/ map_info_box", :object => anything())

Let us know if it works.

Cheers,
David


     mark = prop.has_photos? ? "green" : "red"
marker = GMarker.new(coords, :title => prop_help.bubble_header(prop), :info_window => prop.info_box, :icon => Variable.new(mark))
     @map.overlay_init marker
     @markers << marker
   end
 end
 unless @markers.empty?
@map.center_zoom_on_points_init(*(@markers.collect {|x| x.point}))
 else
   @map.center_zoom_init(@search.center, 12)
 end
end

Thanks,

Andrew

On Jun 16, 2008, at 9:34 PM, David Chelimsky wrote:

On Jun 16, 2008, at 2:58 PM, Andrew Selder wrote:

Hi all,

I have a controller I'm trying to spec out, and I'm running into some issues with render_to_string.

Basically, the show gets an array of objects, calls render_to_string for each of them, and then renders the show template.

So I have the standard spec:


it "should render show template" do
 do_get
 response.should render_template('show')
end


but when I run the spec I get the following failure:

'SearchesController handling GET /searches/1 should render show template' FAILED
expected "show", got "properties/_map_info_box"


Does anybody have any ideas?

Please post the controller action and the full backtrace:

script/spec spec/controller/path/to/the/spec.rb -fsb

Thx
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to