On Sep 16, 2010, at 1:44 AM, Michael Kintzer wrote:

> From: David Chelimsky <[email protected]>
> To: rspec-users <[email protected]>
> Sent: Wed, September 15, 2010 8:51:48 PM
> Subject: Re: [rspec-users] [rails] url_for host and protocol not set when 
> full spec suite run
> 
> On Sep 15, 2010, at 1:05 PM, Michael Kintzer wrote:
> 
>> rspec (2.0.0.beta.19)
>> rails (3.0.0)
>> authlogic (2.1.6)
>> bartt-ssl_requirement (1.2.3)
>> RUBYGEMS VERSION: 1.3.7
>> RUBY VERSION: 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10.4.0]
>> 
>> Hi,
>> 
>> I'm getting different results when running a Rails 3 scaffold generated 
>> controller example depending on whether or not I run 'rspec spec' or 'rspec 
>> spec/controllers'.   The difference occurs when evaluating the dynamic route 
>> methods with for '_url', e.g.  my_model_url   I'm using Authlogic and 
>> SslRequirement as well.  The issue may be in either of those libraries, but 
>> the only difference is how I run the spec suite.   I disable the Ssl 
>> requirement check in the test.rb environment file.
>> 
>> Assume I generated the scaffold code with:  "rails g scaffold scaffold" to 
>> create a "Scaffold" model.
>> 
>> See relevant code here: http://gist.github.com/581130
>> 
>> When I run 'rspec spec/controllers', the example in question passes.  I 
>> placed debug code in url_for.rb (bartt-ssl_requirement-1.2.3) to parse the 
>> options passed to url_for and they include the :host and :protocol 
>> parameters,  :host => "test.host", :protocol => "http://";.
>> 
>> When I run 'rspec spec', the example in question fails.   The url_for 
>> options are missing both the :host and :protocol parameters.   If I manully 
>> pass those into the my_model_url method, the example will pass.   If I use 
>> the _path version of the route method, the example passes.
>> 
>> The stack trace in the failing case is (path to gems directory omitted):
>> 1) ScaffoldsController POST create with valid params redirects to the 
>> created scaffold
>>     Failure/Error: response.should redirect_to(scaffold_url(mock_scaffold))
>>     Missing host to link to! Please provide :host parameter or set 
>> default_url_options[:host]
>>     # .../actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:473:in 
>> `url_for_without_non_ssl_host'
>>     # .../bartt-ssl_requirement-1.2.3/lib/url_for.rb:44:in 
>> `url_for_without_secure_option'
>>     # .../gems/bartt-ssl_requirement-1.2.3/lib/url_for.rb:32:in `url_for'
>>     # .../actionpack-3.0.0/lib/action_dispatch/routing/url_for.rb:132:in 
>> `url_for'
>>     # .../actionpack-3.0.0/lib/action_dispatch/routing/route_set.rb:195:in 
>> `factor_library_url'
>>     # ./spec/controllers/scaffolds_controller_spec.rb:70
>>     # .../activesupport-3.0.0/lib/active_support/dependencies.rb:239:in 
>> `inject'
>> 
>> So, I'm stumped as to why 'rspec spec' is behaving differently from 'rspec 
>> spec/controllers' with respect to generating the appropriate url_for options.
> 
> 
> This sort of problem usually boils down to something interacting with global 
> state - something that is only getting loaded when you run the full suite. To 
> narrow it down, try running subsets of the directories:
> 
> rspec spec/controllers spec/requests
> rspec spec/controllers spec/views
> rspec spec/controllers spec/models
> 
> etc
> 
> HTH,
> David
> 
> -----
> David, thanks for the suggestion.    One of my model specs was including 
> Rails.application.routes.url_helpers, so it could evaluate route paths (b/c 
> one of my models is doing the same, unusual, but supported).   Removing the 
> include fixed the controller spec problem mentioned previously.   Of course 
> this broke the model spec that needed url_helpers, but I was able to work 
> around it by hard-coding what the expected route should be.   
> 
> Any idea why including url_helpers in the model spec causes this particular 
> issue?   It would be nice if there wasn't a conflict.   I haven't traced 
> through it enough to understand why the conflict occurs.


Rails.application.routes.url_helpers is a global object, so if the spec is 
doing anything to change its state that might cause trouble. That's all I can 
think of. How are you including them?

_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to