[rspec-users] render_to_string confusing ControllerSpec

David Chelimsky dchelimsky at gmail.com
Mon Jun 16 23:05:50 EDT 2008


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 (#{@search.count 
>>> }). 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 at rubyforge.org
>>>> http://rubyforge.org/mailman/listinfo/rspec-users
>>>
>>> _______________________________________________
>>> rspec-users mailing list
>>> rspec-users at rubyforge.org
>>> http://rubyforge.org/mailman/listinfo/rspec-users
>>
>> _______________________________________________
>> rspec-users mailing list
>> rspec-users at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/rspec-users
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users



More information about the rspec-users mailing list