Loading problem with engine extending ActionController::Base

I’m working on an engine that extends ActionController::Base like this

module MyEngine
class Engine < Rails::Engine

config.after_initialize do
  ActionController::Base.class_eval do
    include MyEngine::ControllerExtension
  end
end

end
end

This works in the development environment (rails server). It does not
work for specs. No matter if I run rake spec or rspec spec/some_spec.rb.

rake spec indirectly loads the application through this line in Rakefile

require File.expand_path(’…/config/application’, FILE)

in the normal course of rake initialization. During this,
ActionController::Base is loaded and the #after_initialize callback of
MyEngine is called.

Then, when a spec is loaded, that in turn loads spec/spec_helper.rb,
containing this line

require File.dirname(FILE) + “/…/config/environment” unless
defined?(Rails)

Which causes, among other things, a reload of ActionController::Base,
but this time the engine callback is not executed. Thus, the specs
blow up as soon as they run into a method defined in the engine. But,
wait, why is that require executed at all? Isn’t Rails defined at that
point? Apparently it is not and I have no idea why.

rspec spec/some_spec.rb is slightly different. Here
ActionController::Base is loaded just once, but the engine callback is
not executed.

rspec and associated gems are 2.0.0.beta.15
rails is 3.0.0.beta4

I’m stumped.

Michael


Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/

On Jul 3, 2010, at 3:34 PM, Michael S. wrote:

end
in the normal course of rake initialization. During this,
ActionController::Base is loaded and the #after_initialize callback of
MyEngine is called.

Then, when a spec is loaded, that in turn loads spec/spec_helper.rb,
containing this line

require File.dirname(FILE) + “/…/config/environment” unless
defined?(Rails)

This is from an old version of the spec_helper. Be sure to follow the
post-install instructions (that’s what they’re there for) and run
“script/rails generate rspec:install”.

The newer generated spec_helper uses File.expand_path for this require,
so it doesn’t load the file a second time. I believe that will fix this
issue for you.

HTH,
David

On Saturday 03 July 2010, David C. wrote:

On Jul 3, 2010, at 3:34 PM, Michael S. wrote:

[double loading of Rails framework classes]

require File.dirname(FILE) + “/…/config/environment” unless
defined?(Rails)

This is from an old version of the spec_helper. Be sure to follow the
post-install instructions (that’s what they’re there for) and run
“script/rails generate rspec:install”.

Indeed, you’re right. I compared old and new visually (only) and didn’t
notice the difference. As I have some stuff in spec_helper.rb, I don’t
like to overwrite it.

The newer generated spec_helper uses File.expand_path for this
require, so it doesn’t load the file a second time. I believe that
will fix this issue for you.

Unfortunately and surprisingly not. I’m using

ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]

in case that makes a difference.

I can work around this by including the required extension explicitly in
ApplicationController, of course.

Michael


Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/

On Monday 05 July 2010, David C. wrote:

run “script/rails generate rspec:install”.

Did you try both ‘rake spec’ and ‘bundle exec rspec spec’?

bundle exec rspec spec

does not make a difference.

Would you do me a favor and raise
this as an issue in http://github.com/rspec/rspec-rails/issues? I
won’t be able to address this for a bit, and that’s the best way to
ensure it stays on the radar.

There you go:

http://github.com/rspec/rspec-rails/issues/#issue/118

Michael


Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/

On Jul 3, 2010, at 4:40 PM, Michael S. wrote:

Indeed, you’re right. I compared old and new visually (only) and didn’t
notice the difference. As I have some stuff in spec_helper.rb, I don’t
like to overwrite it.

The newer generated spec_helper uses File.expand_path for this
require, so it doesn’t load the file a second time. I believe that
will fix this issue for you.

Unfortunately and surprisingly not.

Did you try both ‘rake spec’ and ‘bundle exec rspec spec’?

I’m using

ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]

in case that makes a difference.

I can work around this by including the required extension explicitly in
ApplicationController, of course.

Yeah, but who wants to do that! Would you do me a favor and raise this
as an issue in http://github.com/rspec/rspec-rails/issues? I won’t be
able to address this for a bit, and that’s the best way to ensure it
stays on the radar.

Cheers,
David