I’m using a HAML helper to draw a menu
module ApplicationHelper
def draw_menu
items = %w[
item1
item2
] # community
capture_haml do
haml_tag :nav, :class => "main-menu" do
haml_tag :ul do
items.each do |item|
css_class = nil
css_class = "first-item" unless item != items.first
css_class = "last-item" unless item != items.last
haml_tag :li, :class => css_class do
haml_concat link_to t("nav.#{item}")
end
end
end
end
haml_tag :div, :class => "clearize"
end
end
end
I’m trying to test it (i’d like to match the expected output to be /<nav class='main-menu'>\s*<\/nav><div class='clearize'><\/div>/)
What I actually did is
require "spec_helper"
describe ApplicationHelper do
before(:all) do
init_haml_helpers
end
it "should draw a menu" do
draw_menu().should_not be_empty
end
end
But it keeps getting the following error:
1) ApplicationHelper should draw a menu
Failure/Error: draw_menu().should_not be_empty
ActionController::RoutingError:
No route matches {}
# ./app/helpers/application_helper.rb:20:in `block (5 levels) in draw_menu'
# ./app/helpers/application_helper.rb:19:in `block (4 levels) in draw_menu'
# ./app/helpers/application_helper.rb:14:in `each'
# ./app/helpers/application_helper.rb:14:in `block (3 levels) in draw_menu'
# ./app/helpers/application_helper.rb:13:in `block (2 levels) in draw_menu'
# ./app/helpers/application_helper.rb:12:in `block in draw_menu'
# ./app/helpers/application_helper.rb:11:in `draw_menu'
# ./spec/helpers/application_helper_spec.rb:10:in `block (2 levels) in <top (required)>'
Why?
How can I make it work as expected?
Thanks!
If you call
link_topassing just a string as that argument, then that string is used as the link text. The target of the link is just given by the current action and controller:url_for(the underlying helper) just merges in the parameters you give with the parameters that make up the current action. This is whygenerates a link to the
an_actionmethod of the controller rendering the view.In a helper spec this environment doesn’t exist: there is no current action or controller, so this doesn’t work