выберите конкретную ссылку по href с помощью webrat

Я пишу интеграционный тест для rspec и хочу проверить, что нажатие на ссылку ведет на правильную страницу модели. В частности, я хочу проверить это на списке ссылок с одинаковым именем, но разными базовыми URL-адресами.

Из того, что я узнал до сих пор, вы не можете использовать селектор атрибутов css с click_link, поскольку он ищет только определенный текст или идентификатор dom. Вместо этого я пытаюсь использовать метод webrat within, но как только я выберу ссылку, как мне ее щелкнуть? Я подумал, что link.click в рамках ссылки будет работать, но он не говорит, что метод click не определен:

Failure/Error: link.click
NoMethodError:
  undefined method `click' for #<Webrat::Scope:0x0000010505ae00>

Вот мой тест:

require 'spec_helper'

describe "BrandLinks" do
  before(:each) do
    @base_title = "My App - "

    @brand = Factory(:brand)
    second = Factory(:brand) # <= Same name, different slug
    third = Factory(:brand, :name => "Awesome USA Brand!!")
    @brands = [@brand, second, third]
  end

  it "should show me the brand page when I click on a brand link" do
    get '/brands'
    within "a[href=#{brand_path(@brand)}]" do |link|
      link.click
    end
    response.should be_success
    response.should have_selector(
      "title", 
      :content => "#{@base_title}Brand - #{@brand.name}"
    )
  end
end

person Chris Bloom    schedule 24.05.2011    source источник
comment
Казалось бы, очевидный ответ здесь — просто добавить еще несколько селекторов на страницу, чтобы я мог выбрать родительский узел ссылки. Если бы я сделал это сейчас, я бы добавил селекторы на страницу только для того, чтобы пройти этот тест. Я хотел бы избежать этого.   -  person Chris Bloom    schedule 24.05.2011
comment
Коллега сказал следующее по поводу моего предыдущего комментария: [When] code is easy to test, it's often a sign that the architecture is coherent and decoupled. I have definitely changed/refactored code purely for testability. I would certainly be more wary of doing this if it actually made the code more complex, but adding an id to an html element, for example, doesn't really increase your technical debt. If it makes the code more testable, I'd say go for it. If the element is important enough for you to test that it's there, it's probably fine for you to give it an id or class. Очко принято.   -  person Chris Bloom    schedule 25.05.2011
comment
Тем не менее, я все еще хотел бы знать, возможно ли то, что я пытался.   -  person Chris Bloom    schedule 25.05.2011


Ответы (2)


Вы пробовали click_link_within? Согласно документам

Работает как click_link, но ищет только текст ссылки внутри данного селектора.

person Dty    schedule 24.05.2011
comment
Похоже, я столкнусь с той же проблемой. Единственный селектор, который можно найти, — это href самой ссылки. Я попробую. - person Chris Bloom; 24.05.2011
comment
Это не удается с Failure/Error: click_link_within "a[href='#{brand_path(@brand)}']", @brand.name Webrat::NotFoundError:Could not find link with text or title or id "Super Brand A", поэтому он должен искать ссылку внутри этой ссылки. - person Chris Bloom; 24.05.2011
comment
Предполагается, что он работает с xpath, но, по-видимому, в webrat есть ошибка. Я не знаю, было ли это исправлено, но вот некоторая информация и обходной путь webrat.lighthouseapp.com/projects/10503-webrat/tickets/ - person Dty; 24.05.2011
comment
Кроме того, часто рекомендуют использовать капибару вместо вебрата. - person Dty; 24.05.2011
comment
@Dty - это может сработать. Я не думаю, что вы могли бы сказать мне, как применить этот разветвленный патч к моему камню webrat? Или мне нужно его клонировать, собрать и gem install использовать локальную копию? - person Chris Bloom; 24.05.2011
comment
Я никогда не делал этого сам, но я бы клонировал, исправлял, устанавливал локальную копию. Но вы уже видели эту ссылку? objectliteral.blogspot.com/2009/ 09/ Попробуйте click_link(link) - person Dty; 24.05.2011
comment
Я видел этот пост, но было неясно, на что ссылались ссылка и link_id. Он не указывает локальную переменную во внутреннем блоке, поэтому я предполагаю, что это не ссылка, а эта ссылка — просто заполнитель для текста или идентификатора, который обычно используется. Я почти уверен, что функции щелчка не принимают объект в качестве ссылки. - person Chris Bloom; 24.05.2011

Во-первых, сообщение об ошибке заключается в том, что метод .click не определен. Вместо этого попробуйте .click_link.

Вам также понадобится текст ссылки. То есть within определяет область, а click_link указывает, по какой ссылке щелкнуть внутри этой области.

within "a[href=#{brand_path(@brand)}]" do |scope| # within a specific <a> tag
  scope.click_link @brand # click on @brand text
end

click_link_within — это ярлык для внутри плюс click_link, так что это должно быть идентичен приведенному выше:

click_link_within "a[href=#{brand_path(@brand)}]", @brand

Я все еще пытаюсь понять, как работают селекторы within (именно так я нашел этот вопрос!). Вот что у меня есть:

withinметод объекта Webrat Session принимает selector аргумент, который использует для помещения новой области видимости в стек путем передачи селектора Scope.from_scope, который создает новый сеанс с @selector = selector. Пока не могу найти определение selector. Этот сообщение в блоге 2009 года говорит, что селектор может быть типом, классом или идентификатором CSS, но не указывает источник для этого.

person Mark Berry    schedule 18.10.2011