Question

I want to implement a tagging system similar to stackoverflow, there is a box with a tags at top right corner, and also I have links to delete tag from params hash. my method works correctly in browser. But I can't find a way to test it.

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

I've tried:

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

but it return:

<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>

and shoud return remove link as

href="/questions/tagged/ship+sun" without sea

I would appreciate any advice

Was it helpful?

Solution

The params field is going to come back parsed into the correct ruby data structures (hash, array, string, etc). There's no need to manually split items such as +, if there is a nested param it will return as part of the params object:

{tags: ["sea", "ship", "sun"]}

To access your data, or create an assumption about your param data existing in the test, you're going to want to create a stub. You're almost there, try something more along the lines of:

helper.stub!(:params).and_return({tags: ["sea", "ship", "sun"]})

Once you have the params stubbed correctly you can check the output of your helper method to ensure it's validity (this is called the expectation):

expect(helper.tags_list_with_destroy_links).to eq("some_url")
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top