Testing Mounted Engines

When I mount an engine in config/routes.rb like so:

    mount Blog::Engine => "/blog"

I'd like to be able to test that the routing is there. I added
assert_mounts to
ActionDispatch::Assertions::RoutingAssertions (https://gist.github.com/
a57e3addfe0aa3857e12). Does anyone else see value for this in core? Is
the code okay?

Yeah i have spent the last week trying to mount an app, is anyone else
facing the same issue?

I don't think that you need to do such unit tests, without mounting an
engine you will not be able to reach engine's routes, so tests will
fail anyway.

Yeah i have spent the last week trying to mount an app

Remember that this is still an edge version and some things can (and
probably will) change. I didn't want to go with detailed guides before
finishing work on new generator.

Short story of creating mountable engine right now:

# clone rails app and install dependencies
git clone git://github.com/rails/rails.git
cd rails
bundle install

# generate engine with routes and test dummy with engine already
mounted
bundle exec ./bin/rails plugin new /path/to/engine_name --dev --
mountable
cd /path/to/engine_name
bundle install

# generate scaffold to test it
./script/rails generate scaffold post title:string content:text

# run migrations
cd test/dummy
rake engine_name:install:migrations
rake db:migrate
./script/rails s

navigate to localhost:3000/engine_name/posts

Testing is done using test/dummy.

I personally would not use that. You're just adding line to tests that
ensures that you added line to routes.

Instead of doing that I would rather add some higher level test that
checks if you can reach engine at blog.root_path. But that's just my
opinion and I'm not in core, so maybe you will get more luck with the
others :wink:

Damn, google groups ate my post, so again :wink:

Joe Fiorini:
I don't like that kind of tests. You just add a line in tests that
ensures that you added a line in routes. Better way to do that would
be to check if engine can be properly rendered inside application. But
I'm not in core and it's only my biased opinion, so maybe you will get
more luck with someone else :wink:

krishna:
Remember that's still edge version, it's not in stable branch, it's
not released. While I know that things were moving slowly for engines
a few last weeks, I'll try to catch up in next few days.

Short story for creating a mountable application right now (blog as an
example):
# close edge version of rails and install dependencies
git clone https://github.com/rails/rails.git
cd rails
bundle install

# create actual engine
bundle exec ./bin/rails plugin new /path/to/blog --dev --mountable

#install dependencies
cd /path/to/blog
bundle install

# create simple scaffold
./script/rails generate scaffold post title:string content:text

cd test/dummy
rake blog:install:migrations
rake db:migrate

./script/rails s

navigate to localhost:3000/blog/posts

I agree with Piotr.

You should never be testing that routes are there in your application, but rather that whatever’s on the end of that route is performing as it should.

Let’s say that I have a /forums route that displays a list of forums, one of them being called “The Ghetto”. In my test, I would assert that when I go to ForumsController#index that I see “The Ghetto” within “#forums h2”.

By doing this I’m testing at least three things:

  1. The route exists and that I can route to the controller

  2. The controller assigns information to a variable that the view can use

  3. The view renders that information correctly*

(Correctly is subjective, design is an inexact science)