Engines in engines: not loaded in dummy test app

A recent discussion here has brought konacha, an engine for testing JavaScript code, to my attention. In the meantime, I have extracted common code from several applications into an engine and there I would like to add some tests for the scripts.

With current versions of Rails, when I create an engine with

$ rails new plugin my_engine --mountable

among all the other niceties I get is an dummy application for testing purposes in test/dummy. Unfortunately, things are not set-up properly for testing. Dependencies specified in my_engine.gemspec are not loaded, or if they are they are loaded too late. As a consequence, the asset paths from the jquery-rails engine are not added to the dummy application's asset paths.

In order to get those engines loaded at the right time, I need to add explicit requires in test/dummy/config/application.rb, just below the generated require "my_engine". Ideally, none of these requires would be necessary and Bundler.require (that's already there) would automatically load all dependencies from the enclosing engine's gemspec.

For the specific case of konacha that still would not be enough (on top of this, it needs to set different additional asset paths, then when in an app environment), but it would be a good start.

Michael

A recent discussion here has brought konacha, an engine for testing

JavaScript code, to my attention. In the meantime, I have extracted

common code from several applications into an engine and there I would

like to add some tests for the scripts.

With current versions of Rails, when I create an engine with

$ rails new plugin my_engine --mountable

among all the other niceties I get is an dummy application for testing

purposes in test/dummy. Unfortunately, things are not set-up properly

for testing. Dependencies specified in my_engine.gemspec are not loaded,

or if they are they are loaded too late. As a consequence, the asset

paths from the jquery-rails engine are not added to the dummy

application’s asset paths.

In order to get those engines loaded at the right time, I need to add

explicit requires in test/dummy/config/application.rb, just below the

generated require “my_engine”. Ideally, none of these requires would be

necessary and Bundler.require (that’s already there) would automatically

load all dependencies from the enclosing engine’s gemspec.

I believe you can also add the dependancies to the Gemfile of the engine. In fact, I think jquery-rails is specified in the Gemfile but commented out.

I’m not saying this is ideal or anything, but I think that’s the “accepted” way to get it working.

Jeremy

Yes, I can do that and now I did. What I didn't expect is that gems specifified in the Gemfile are treated differently than those specified in the gemspec. Gems from the gemspec are not automatically required, while those from the Gemfile are (unless the require: false option is used).

As far as Rails concerned, case closed. Thanks!

Michael

What I usually do to work around such issues is to explicitly require the required gems in my Engine main file:

https://github.com/rosenfeld/oojs/blob/master/lib/oojs.rb

As you can see, just setting the gem dependency in the gemspec is not enough for automatically requiring them:

https://github.com/rosenfeld/oojs/blob/master/oojs.gemspec

That's another way, but you wouldn't want to use it for development dependencies. Say you're using capybara-wekbit for testing your engine, you still don't want to have it as a runtime dependency.

Michael

Sure, that doesn't apply for development dependencies.