#post method in tests with a different controller
I wanted a #login method in test_helper that would allow me to easily login from any of my functional tests. However, the #post method won’t allow you to set a different controller than the one in the @controller instance variable that’s defined in your test’s #setup. Well, by looking at how the #process method works, you can see that it just grabs the controller from @controller. Redefine that, and you’re good to go:
1 2 3 4 5 6 7 |
old_controller = @controller @controller = LoginController.new post( :attempt_login, {:user => {:name => 'joe', :password => 'password'}} ) @controller = old_controller |
If you have several login methods, such as a #login_admin
and #login_regular
, you could make a wrapper to reduce duplication:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
def wrap_with_controller( new_controller = LoginController ) old_controller = @controller @controller = new_controller.new yield @controller = old_controller end def login_admin wrap_with_controller do post( :attempt_login, {:user => {:name => 'root', :password => 'password'}} ) end end def login_regular wrap_with_controller do post( :attempt_login, {:user => {:name => 'joe', :password => 'password'}} ) end end |
comments powered by Disqus