Модульный тест для помощника, который меняет поведение в зависимости от текущего пути? - PullRequest
2 голосов
/ 09 августа 2011

Я пытаюсь проверить следующий вспомогательный метод в рельсах:

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

Есть ли другой способ?

Ответы [ 3 ]

10 голосов
/ 16 ноября 2011

У меня была та же проблема, и я поставил ее на тестовом уровне.

self.stub!("current_page?").and_return(true)
2 голосов
/ 25 апреля 2013

В 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
0 голосов
/ 15 июня 2014

Попробуйте использовать:

view.stub!(:current_page?).and_return(true)
...