我正在尝试在rails中测试以下帮助器方法:
def current_has_class_link(text, path, class_name="selected")
link_to_unless_current(text, path) do
link_to(text, path, :class => class_name)
end
end
我正在尝试进行类似的测试:
describe "current_has_class_link" do
let(:link_path){ listings_path }
let(:link_text){ "Listings" }
it "should render a normal link if not on current path" do
html = "<a href=\"#{link_path}\">#{link_text}</a>"
current_has_class_link(link_text, link_path).should == html
end
it "should add a class if on the links path" do
# at this point I need to force current_path to return the same as link_path
html = "<a href=\"#{link_path}\" class=\"selected\">#{link_text}</a>"
current_has_class_link(link_text, link_path).should == html
end
end
现在显然我可以使用集成测试,但这似乎对我来说太过分了。有没有办法可以存根current_page?
以便它返回我需要的东西?
我试着做
ActionView::Helpers::UrlHelper.stub(current_page?({controller: 'listings', action: 'index'})).and_return(link_path)
但这给了我一个我不太懂的错误:
Failures:
1) ApplicationHelper current_has_class_link should add a class if on the links path
Failure/Error: ActionView::Helpers::UrlHelper.stub(current_page?({controller: 'listings', action: 'index'})).and_return(link_path)
RuntimeError:
You cannot use helpers that need to determine the current page unless your view context provides a Request object in a #request method
# ./spec/helpers/application_helper_spec.rb:38:in `block (3 levels) in <top (required)>'
还有其他办法吗?
答案 0 :(得分:10)
我遇到了同样的问题,而是在测试级别将其删除。
self.stub!("current_page?").and_return(true)
答案 1 :(得分:2)
在Test:Unit
中,您可以使用attr_reader
将请求设置为方法。
class ActiveLinkHelperTest < ActionView::TestCase
attr_reader :request
test "should render a normal link if not on current path" do
html = "<a href=\"#{link_path}\">#{link_text}</a>"
assert_equal html, current_has_class_link(link_text, link_path)
end
test "should add a class if on the links path" do
# Path can be set.
# note: the default is an empty string that will never match)
request.path = link_path
html = "<a href=\"#{link_path}\" class=\"selected\">#{link_text}</a>"
assert_equal html, current_has_class_link(link_text, link_path)
end
end
答案 2 :(得分:0)
尝试使用:
view.stub!(:current_page?).and_return(true)