[rspec-rails] how to controller test redirects back to main_app paths in a rails 4.1 engine

937 views
Skip to first unread message

Vell

unread,
Aug 5, 2014, 9:49:20 AM8/5/14
to rs...@googlegroups.com
Hello all,

I am creating a rails 4.1 engine and am having trouble figuring out how to test the controllers redirect action back to the main_app.root_path. I have been struggling with this for a while and am hoping I can get a little guidance on this.

Basically if I have a create action such as:

def create
 
@user = User.new(user_params)
 
if @user.save
    flash
[:success] = "User Saved!"
   
redirect_to main_app.root_path
 
else
    flash
[:error] = "User Not Saved! Check Errors"
    render
:new
 
end
end

I get an error that says main_app is nil. I expect this since my spec directory is in the root of my engine. How would I go about testing creating a controller test where I would be able to test redirecting back to routes in the main_app? This should hopefully help me with the next step of integration testing as well.

Any advice is greatly appreciated.

Thanks

Javix

unread,
Aug 7, 2014, 3:30:29 AM8/7/14
to rs...@googlegroups.com
To test a redirect you should so smth like that(to be adapted to your fixtures, or FactiryGirl or whatever you use):

it "redirects to the home page upon save" do
  post
:create, contact: FactoryGirl.attributes_for(:contact)
  expect
(response).to redirect_to root_url #or some other url
end


Sure, in your code, main_app is an undefined variable, that's why you're getting Nil.

vell

unread,
Aug 11, 2014, 11:02:19 PM8/11/14
to rs...@googlegroups.com
I was wondring how to make it so that main_app was not nil. The error that was given to me by rspec made it clear that main_app was nil. I figured there had to be a way to access the main_app's routes that I just wasn't able to figure out.

This answer was given to me yesterday (since I was not able to figure this out myself). For those that may be interested in how this issue was solved, I created a macro with the following in it:

def main_app
  Rails.application.class.routes.url_helpers
end

and that allows me to get to the main_app routes for testing redirects and so on.


--
You received this message because you are subscribed to the Google Groups "rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rspec+un...@googlegroups.com.
To post to this group, send email to rs...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/1d9fa996-1f2b-4a0e-883f-7c7a596c6f46%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Serguei Cambour

unread,
Aug 12, 2014, 3:16:19 AM8/12/14
to rs...@googlegroups.com
If you isolated you engine like that (engine_app/lib/engine.rbà)

isolate_namespace YourEngineName

Routes inside an engine are isolated from the application by default. This is done by the isolate_namespace call inside the Engine class. This essentially means that the application and its engines can have identically named routes and they will not clash.

Routes inside an engine are drawn on the Engine class within config/routes.rb, like this:

YourEngineName::Engine.routes.draw do
  resources :posts
end

For instance, the following example would go to the application's posts_path if that template was rendered from the application, or the engine's posts_path if it was rendered from the engine:
<%= link_to "Blog posts", posts_path %>
To make this route always use the engine's posts_path routing helper method, we must call the method on the routing proxy method that shares the same name as the engine.
<%= link_to "Blog posts", blorgh.posts_path %>
If you wish to reference the application inside the engine in a similar way, use the main_app helper:
<%= link_to "Home", main_app.root_path %>

Hope this helps


--
You received this message because you are subscribed to a topic in the Google Groups "rspec" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/rspec/yvNa2nWwR-s/unsubscribe.
To unsubscribe from this group and all its topics, send an email to rspec+un...@googlegroups.com.

To post to this group, send email to rs...@googlegroups.com.

vell

unread,
Aug 12, 2014, 6:25:44 PM8/12/14
to rs...@googlegroups.com
On Aug 12, 2014, at 3:16 AM, Serguei Cambour <s.ca...@gmail.com> wrote:

If you isolated you engine like that (engine_app/lib/engine.rbà)

isolate_namespace YourEngineName

Routes inside an engine are isolated from the application by default. This is done by the isolate_namespace call inside the Engine class. This essentially means that the application and its engines can have identically named routes and they will not clash.

Routes inside an engine are drawn on the Engine class within config/routes.rb, like this:

YourEngineName::Engine.routes.draw do
  resources :posts
end

For instance, the following example would go to the application's posts_path if that template was rendered from the application, or the engine's posts_path if it was rendered from the engine:
<%= link_to "Blog posts", posts_path %>
To make this route always use the engine's posts_path routing helper method, we must call the method on the routing proxy method that shares the same name as the engine.
<%= link_to "Blog posts", blorgh.posts_path %>
If you wish to reference the application inside the engine in a similar way, use the main_app helper:
<%= link_to "Home", main_app.root_path %>

Hope this helps


That is the interesting thing. That is what I was using in my test before defining a method that had Rails.application.class.routes.url_helpers in it. The main_app helper wasn't available to me out of the box. I thought it was very strange since I expected things to work just as you explained it but for me that just wasn't the case.

I am glad you explained this the way you did. I wasn't aware that the templates would infer the route based on what route called the template.

Serguei Cambour

unread,
Aug 13, 2014, 3:02:20 AM8/13/14
to rs...@googlegroups.com
You're welcome. You can find more about Rails engines here.

Regards


Reply all
Reply to author
Forward
0 new messages