I am driving out a view and I want to test that a link is displayed. The link_to code for the link is included in the layout for the view rather than the view template itself. Here''s my example: it "should display a link to create a new zone" do render "contexts/index.html.erb", :layout => "layouts/ contexts.html.erb" response.should contain("sign out") end Firstly, my experiments suggest that the layout is only rendered if the :layout attribute is included in the call to render. Is my understanding correct? Secondly, the link_to code only executes if the session contains a piece of data (member id). How do I set up the session data in my view spec? Thanks.
Stephen Eley
2009-Jun-05 16:39 UTC
[rspec-users] Driving Out A View - Layouts and Sessions?
On Fri, Jun 5, 2009 at 11:40 AM, Lee<Lee.Longmore at googlemail.com> wrote:> > Firstly, my experiments suggest that the layout is only rendered if > the :layout attribute is included in the call to render. Is my > understanding correct?Yes, and it''s the way things should be. I suggest writing a separate spec for the layout, and testing its behavior separate from the view. After all, you''re *unit* testing here. And the layout is a separate unit.> Secondly, the link_to code only executes if the session contains a > piece of data (member id). How do I set up the session data in my view > spec?With the session[] object, e.g. "session[:foo] = bar". See: http://rspec.info/rails/writing/views.html Whether the view (or layout) should be looking directly into the session and making decisions from what it sees, instead of trusting what it gets from the controller, is another question. "Is there a current user?" is _probably_ closer to your actual business rules than "Does the session contain a member id?" -- Have Fun, Steve Eley (sfeley at gmail.com) ESCAPE POD - The Science Fiction Podcast Magazine http://www.escapepod.org
Thanks Steve. As suggested I started to wrtite a separate spec for the layout: require File.expand_path(File.dirname(__FILE__) + ''/../../ spec_helper'') describe "layouts/contexts.html.erb" do it "should display a link to create a new zone" do render "layouts/contexts.html.erb" end end When I execute this, it complains of a missing method "sub_menu". This method, along with others such as "main_menu", are called within the layout. Unlike "main_menu" which is defined in my "application_helper.rb" file, "sub_menu" is defined in the helper file for the controller "contexts". How do I get the spec to "see" this file and its contents when executed? I think It''s seeing "main_menu". Thanks. On 5 June, 17:39, Stephen Eley <sfe... at gmail.com> wrote:> On Fri, Jun 5, 2009 at 11:40 AM, Lee<Lee.Longm... at googlemail.com> wrote: > > > Firstly, my experiments suggest that the layout is only rendered if > > the :layout attribute is included in the call to render. Is my > > understanding correct? > > Yes, and it''s the way things should be. ?I suggest writing a separate > spec for the layout, and testing its behavior separate from the view. > After all, you''re *unit* testing here. ?And the layout is a separate > unit. > > > Secondly, the link_to code only executes if the session contains a > > piece of data (member id). How do I set up the session data in my view > > spec? > > With the session[] object, e.g. "session[:foo] = bar". ?See:http://rspec.info/rails/writing/views.html > > Whether the view (or layout) should be looking directly into the > session and making decisions from what it sees, instead of trusting > what it gets from the controller, is another question. ?"Is there a > current user?" is _probably_ closer to your actual business rules than > "Does the session contain a member id?" > > -- > Have Fun, > ? ?Steve Eley (sfe... at gmail.com) > ? ?ESCAPE POD - The Science Fiction Podcast Magazine > ? ?http://www.escapepod.org > _______________________________________________ > rspec-users mailing list > rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users
David Chelimsky
2009-Jun-06 11:06 UTC
[rspec-users] Driving Out A View - Layouts and Sessions?
On Sat, Jun 6, 2009 at 12:01 AM, Lee <Lee.Longmore at googlemail.com> wrote:> Thanks Steve. > > As suggested I started to wrtite a separate spec for the layout: > > require File.expand_path(File.dirname(__FILE__) + ''/../../ > spec_helper'') > > describe "layouts/contexts.html.erb" do > > ?it "should display a link to create a new zone" do > ? ?render "layouts/contexts.html.erb" > ?end > > end > > When I execute this, it complains of a missing method "sub_menu". This > method, along with others such as "main_menu", are called within the > layout. Unlike "main_menu" which is defined in my > "application_helper.rb" file, "sub_menu" is defined in the helper file > for the controller "contexts". How do I get the spec to "see" this > file and its contents when executed? I think It''s seeing "main_menu".http://rspec.rubyforge.org/rspec-rails/1.2.6/classes/Spec/Rails/Example/ViewExampleGroup.html#M000049> > Thanks. > > On 5 June, 17:39, Stephen Eley <sfe... at gmail.com> wrote: >> On Fri, Jun 5, 2009 at 11:40 AM, Lee<Lee.Longm... at googlemail.com> wrote: >> >> > Firstly, my experiments suggest that the layout is only rendered if >> > the :layout attribute is included in the call to render. Is my >> > understanding correct? >> >> Yes, and it''s the way things should be. ?I suggest writing a separate >> spec for the layout, and testing its behavior separate from the view. >> After all, you''re *unit* testing here. ?And the layout is a separate >> unit. >> >> > Secondly, the link_to code only executes if the session contains a >> > piece of data (member id). How do I set up the session data in my view >> > spec? >> >> With the session[] object, e.g. "session[:foo] = bar". ?See:http://rspec.info/rails/writing/views.html >> >> Whether the view (or layout) should be looking directly into the >> session and making decisions from what it sees, instead of trusting >> what it gets from the controller, is another question. ?"Is there a >> current user?" is _probably_ closer to your actual business rules than >> "Does the session contain a member id?" >> >> -- >> Have Fun, >> ? ?Steve Eley (sfe... at gmail.com) >> ? ?ESCAPE POD - The Science Fiction Podcast Magazine >> ? ?http://www.escapepod.org >> _______________________________________________ >> rspec-users mailing list >> rspec-us... at rubyforge.orghttp://rubyforge.org/mailman/listinfo/rspec-users > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
Stephen Eley
2009-Jun-06 23:08 UTC
[rspec-users] Driving Out A View - Layouts and Sessions?
On Sat, Jun 6, 2009 at 1:01 AM, Lee<Lee.Longmore at googlemail.com> wrote:> > When I execute this, it complains of a missing method "sub_menu". This > method, along with others such as "main_menu", are called within the > layout. Unlike "main_menu" which is defined in my > "application_helper.rb" file, "sub_menu" is defined in the helper file > for the controller "contexts". How do I get the spec to "see" this > file and its contents when executed? I think It''s seeing "main_menu".Just require it and then include it. A "describe" block is really just a prettified form of class definition, so you can include any modules you like in it. Although (warning: continued smartassery here) I''m also wondering why it''s a good idea to call a method defined in a specific controller''s helper from a global layout. Is this layout only used by that controller? If not, why isn''t the method in application helpers? -- Have Fun, Steve Eley (sfeley at gmail.com) ESCAPE POD - The Science Fiction Podcast Magazine http://www.escapepod.org