我想实现一个类似于stackoverflow的标记系统,右上角有一个带标签的框,我也有链接从params hash删除标签。我的方法在浏览器中正常工作。但我找不到测试它的方法。
def tags_list_with_destroy_links
if params[:tags]
li = ""
p = params[:tags].split("+") # '/tagged/sea+ship+sun' => ['sea', 'ship', 'sun']
p.map do |t|
remove_link = if p.count >= 3
c = p.reject {|item| item == t }
a = c.join("+")
{:tags => a}
elsif p.count == 2
c = p.reject {|item| item == t }
{tags: c[0]}
else
questions_url
end
li << content_tag(:li) do
link_to(t, questions_tags_path(t), class: 'tag') +
link_to( '', remove_link , class: 'icon-small icons-cross')
end
end
ul = content_tag(:ul, li.html_safe)
ul << tag(:hr)
end
end
我试过了:
it 'return list with selected tags' do
#Rails.application.routes.url_helpers.stub(:questions_tags).and_return('/questions/tagged/sea+ship+sun')
#helper.request.stub(:path).and_return('/questions/tagged/sea+ship+sun')
helper.stub(:url_for, {controller:'questions', action: 'index', tags:'sea+ship+sun'} ).and_return('/questions/tagged/sea+ship+sun')
helper.params[:tags] = 'sea+ship+sun'
helper.tags_list_with_destroy_links.should == 'list_with_tags'
end
但它返回:
<a class=\"tag\" href=\"/questions/tagged/sea+ship+sun\">sea</a><a class=\"icon-small icons-cross\" href=\"/questions/tagged/sea+ship+sun\"></a></li>
并将shoud返回删除链接
href =“/ questions / tagged / ship + sun”没有海
我很感激任何建议
答案 0 :(得分:4)
params字段将被重新解析为正确的ruby数据结构(哈希,数组,字符串等)。没有必要手动拆分+
等项目,如果有嵌套参数,它将作为params对象的一部分返回:
{tags: ["sea", "ship", "sun"]}
要访问您的数据,或创建有关测试中存在的参数数据的假设,您需要创建存根。你几乎就在那里,尝试更多的东西:
helper.stub!(:params).and_return({tags: ["sea", "ship", "sun"]})
一旦你有正确的params存根,你可以检查你的助手方法的输出,以确保它的有效性(这称为期望):
expect(helper.tags_list_with_destroy_links).to eq("some_url")