isolated engine, routing helpers, testing?

I believe this is a missing feature/bug, but when I tried to file an issue (isolated engine, routing helpers, testing? · Issue #6573 · rails/rails · GitHub) I was told to post it here instead. So, okay, doing my duty! I suspect that nobody will pay any attention to this, and a year from now when someone google's for this issue this post is going to be all they find, but I'd love to be proven wrong!

I believe there is no way using the standard supported Rails testing framework to test routes from an `isolated` engine. Or to test helpers that use these routes.

I believe there is no way to test isolated engine helpers or use isolated engine helpers in tests. But I'd be pleased if I'm wrong and I'm just missing something.

If you create an isolated engine, then the dummy app has a config/ routes that has for instance mount Widget::Engine => "/widget"

If the Widget engines has it's own config/routes, then ordinarily an app with that line in it would be able to access the engine's route path helpers as widget.some_path.

That works in the app. But it does not work in the test environment. No such method widget, the widget. method isn't installed in the test environment.

The main engine root widget_path => /widget is installed in the testing environment, you can use it in tests and test routing involving that named helper and path. But not any of the specific widget routes that would ordinarily, in an actual app, be available at widget.some_path.

Phew, this is confusing to talk about, hope this is understandable.

I guess I'll keep hacking away at it and looking at Rails source, maybe file a pull request if I can figure out what's going on, but this is very convoluted code, even before you pull the testing environment into it.

Providing an actual test case that demonstrates the problem would be a lot more effective. :slight_smile:

Jonathan Rochkind wrote in post #1062792:

I believe there is no way using the standard supported Rails testing framework to test routes from an `isolated` engine. Or to test helpers that use these routes.

Jonathan,

This is effectively a guess, not knowing your environment or testing situation, but in the case of using rspec and wanting to share your engine's routes & url_helpers with your dummy app, try adding the line:

config.include <YourEngineName>::Engine.routes.url_helpers

to the RSpec.configure block in /spec/spec_helper.rb.

See Ryan Bigg's Start Your Engines blog post for details:

http://reinteractive.net/posts/2-start-your-engines

Look for this paragraph:

"Now, these routing helpers aren't available immediately even still. At the moment, because of how our application is loaded, we've only got access to the routing helpers from the dummy application. To gain access to the engine's routes we must add this line to RSpec.configure in spec/spec_helper.rb:

    config.include Forem::Engine.routes.url_helpers

Hope it helps.

-J