Rspec,Rails - 如何测试使用params hash的helper方法?

时间:2013-12-09 02:50:54

标签: ruby-on-rails rspec view-helpers

我想实现一个类似于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”没有海

我很感激任何建议

1 个答案:

答案 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")