I''m trying to write some tests for the ApplicationController as shared tests that can be run in all of my other controller tests, but am getting a nil.rewrite error. Below is what I have... describe AccountController do it_should_behave_like ''Application controller'' end describe ''Application controller'', :shared => true do it ''should fail require_login check if not logged in'' do User.current = nil controller.require_login.should be_false response.should redirect_to(:controller => ''account'', :action => ''logon'') end end def require_login return true if User.current.logged_in? redirect_to :controller => "account", :action => "logon" and return false end The line it''s failing on is the redirect_to in require_login. What am I doing wrong? Thanks, Steve
David Chelimsky
2007-Oct-16 04:46 UTC
[rspec-users] Failure trying to test ApplicationController
On 10/15/07, Steve <vertebrate at gmail.com> wrote:> I''m trying to write some tests for the ApplicationController as shared > tests that can be run in all of my other controller tests, but am getting > a nil.rewrite error. Below is what I have... > > describe AccountController do > it_should_behave_like ''Application controller'' > end > > describe ''Application controller'', :shared => true do > > it ''should fail require_login check if not logged in'' do > User.current = nil > controller.require_login.should be_false > response.should redirect_to(:controller => ''account'', :action => ''logon'') > end > end > > def require_login > return true if User.current.logged_in? > > redirect_to :controller => "account", :action => "logon" and return false > end > > The line it''s failing on is the redirect_to in require_login. What am I > doing wrong?What''s the error?
On Mon, 15 Oct 2007 23:46:32 -0500, David Chelimsky wrote:> On 10/15/07, Steve <vertebrate at gmail.com> wrote: >> I''m trying to write some tests for the ApplicationController as shared >> tests that can be run in all of my other controller tests, but am getting >> a nil.rewrite error. Below is what I have... >> >> describe AccountController do >> it_should_behave_like ''Application controller'' >> end >> >> describe ''Application controller'', :shared => true do >> >> it ''should fail require_login check if not logged in'' do >> User.current = nil >> controller.require_login.should be_false >> response.should redirect_to(:controller => ''account'', :action => ''logon'') >> end >> end >> >> def require_login >> return true if User.current.logged_in? >> >> redirect_to :controller => "account", :action => "logon" and return false >> end >> >> The line it''s failing on is the redirect_to in require_login. What am I >> doing wrong? > > What''s the error?NoMethodError in ''AccountController should fail require_login check if not logged in'' You have a nil object when you didn''t expect it! The error occurred while evaluating nil.rewrite trunk/app/controllers/application.rb:28:in `require_login'' ./spec/controllers/application_controller_spec.rb:12: The "redirect_to" call is line 28, and "controller.require_login.should" is line 12.
David Chelimsky
2007-Oct-16 05:26 UTC
[rspec-users] Failure trying to test ApplicationController
On 10/15/07, Steve <vertebrate at gmail.com> wrote:> I''m trying to write some tests for the ApplicationController as shared > tests that can be run in all of my other controller tests, but am getting > a nil.rewrite error. Below is what I have... > > describe AccountController do > it_should_behave_like ''Application controller'' > end > > describe ''Application controller'', :shared => true do > > it ''should fail require_login check if not logged in'' do > User.current = nil > controller.require_login.should be_false > response.should redirect_to(:controller => ''account'', :action => ''logon'')You get responses (i.e. the response object in the spec) from actions using get, post, put, delete, not by calling methods directly on the controller. Part of the problem is that you''re trying to spec something that already exists. Developing spec-first, you wouldn''t likely end up with this problem because this method would have appeared because you refactored it out of an existing action, which was already spec''d. To be honest, I''m not quite sure how to spec this. One way would be to set a message expectation for the call to redirect_to: controller.should_receive(:redirect_to) controller.require_login Anybody else have any ideas?
On Tue, 16 Oct 2007 00:26:13 -0500, David Chelimsky wrote:> > You get responses (i.e. the response object in the spec) from actions > using get, post, put, delete, not by calling methods directly on the > controller. > > Part of the problem is that you''re trying to spec something that > already exists. Developing spec-first, you wouldn''t likely end up with > this problem because this method would have appeared because you > refactored it out of an existing action, which was already spec''d. > > To be honest, I''m not quite sure how to spec this. One way would be to > set a message expectation for the call to redirect_to: > > controller.should_receive(:redirect_to) > controller.require_login > > Anybody else have any ideas?I see what you''re saying I think. That the application controller stuff isn''t setup properly because no initial request(get/post) has been made. Attaching these tests to every describe out there for a given controller seems overkill. Since if the one spec for testing the application controller tests all of its methods, then it should be fine wherever its used it would seem. Would it be enough to just make a call to some controller/action in the app to get everything initialized?
David Chelimsky
2007-Oct-16 06:02 UTC
[rspec-users] Failure trying to test ApplicationController
On 10/16/07, Steve <vertebrate at gmail.com> wrote:> On Tue, 16 Oct 2007 00:26:13 -0500, David Chelimsky wrote: > > Part of the problem is that you''re trying to spec something that > > already exists. Developing spec-first, you wouldn''t likely end up with > > this problem because this method would have appeared because you > > refactored it out of an existing action, which was already spec''d. > > I see what you''re saying I think. That the application controller stuff > isn''t setup properly because no initial request(get/post) has been > made. > > Attaching these tests to every describe out there for a given > controller seems overkill. Since if the one spec for testing the > application controller tests all of its methods, then it should be fine > wherever its used it would seem.But how do you know that it''s being used? The behaviour you''re spec''ing is that a given action should redirect if the user is not logged in, right? If you look at it that way, then it seems perfectly acceptable to do this: describe "some action on some controller" do it_should_behave_like "action that requires login" ... end
On Tue, 16 Oct 2007 01:02:58 -0500, David Chelimsky wrote:> But how do you know that it''s being used? The behaviour you''re > spec''ing is that a given action should redirect if the user is not > logged in, right? If you look at it that way, then it seems perfectly > acceptable to do this: > > describe "some action on some controller" do > it_should_behave_like "action that requires login" > ... > endI see what you''re saying now, and agree that that''s probably the best way to approach it. Thanks.