El 14/2/2009, a las 21:56, James Byrne <li...@ruby-forum.com> escribió:
Wincent Colaiuta wrote:
# always return false for tests
return false if RAILS_ENV == 'test'
I brand this as "hideous" because it commits the heinous crime of
dynamically modifying application behaviour only when execution
within
the testing context is detected. Ugh.
For the time being, though, looks like the only way to get my
Cucumber
features working. At least until I find out a better way.
Cheers,
Wincent
I am reluctant to go forward on this because I have not yet dealt with
this problem first hand. However, I looked into this issue briefly in
the past and it seemed to me that the behaviour you wish to test might
be triggered by setting one or more of the following environment
variables. Since you can set these outside your application code then
this might satisfy your desire to avoid custom test code therein.
It appears that either one of these is sufficient by itself:
HTTPS = ?on?
HTTP_X_FORWARDED_PROTO = ?https?
I read somewhere that this one might prove necessary in addition to
the
foregoing.
HTTP_X_FORWARDED_SSL = ?on?
As I wrote, I have not tested any of this.
I haven't (yet) tested it either, but from looking at the Rails source
code it looks like you could be right. The "ssl?" method is defined in
actionpack/lib/action_controller/request.rb as follows:
# Is this an SSL request?
def ssl?
@env['HTTPS'] == 'on' || @env['HTTP_X_FORWARDED_PROTO'] ==
'https'
end
That's in ActionController::Request, which
ActionController::TestRequest inherits from (see vendor/rails/
actionpack/lib/action_controller/test_process.rb). So you would think
that setting the environment variable should indeed work.
Further snooping in the source (actionpack/lib/action_controller/
integration.rb) shows that while using integration tests, at least,
you should also be able to do a "session.https!" to indicate that
you're simulating an HTTPS request. So in Cucumber stories that should
work too (I gather that Cucumber just wraps Rails' built-in
integration testing).
[Goes off to test if this actually works...]
Ok, so I tried just sticking an "ENV['HTTPS'] = 'on'" in my spec/
spec_helper.rb file and re-running my spec suite. Looks like this is
not enough in itself, as I got about 77 spec failures, all of them
apparently caused by "ssl?" returning false and producing unwanted
redirects.
It appears that setting ENV in spec/spec_helper.rb has no effect on
the @env instance variable inside ActionController::AbstractRequest.
Setting it "sooner" (ie. from the command line with "HTTPS=on rake
spec") is evidently not the solution either. I'll need to pore over
the labyrinthine source code a little more to figure out exactly how
and where @env is getting set up.
Ok... had to dig a little bit outside of Rails, into the Rack gem
installed on the system, to find out where @env is getting set up.
Looks like it's getting passed in as a parameter to
Rack::Request.initialize, but looks like it's not coming from the
environment, and the backtrace I get is totally useless (only one
frame in it!). So I guess I'm going to put further investigation on
hold.
Cheers,
Wincent
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users