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?
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?
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?”
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”.
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?
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”.