Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Chris BloomОтветов: 2

Я пишу интеграционный тест для 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
  • Казалось бы, очевидный ответ здесь - просто добавить еще несколько селекторов на страницу, чтобы я мог выбрать родительский узел ссылки. Если бы я сделал это сейчас, я бы добавил селекторы на страницу только для того, чтобы пройти этот тест. Я хотел бы избежать этого. Chris Bloom 24.05.2011
  • Коллега сказал следующее по поводу моего предыдущего комментария: [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. Очко. Chris Bloom 25.05.2011
  • Тем не менее, я все еще хотел бы знать, возможно ли то, что я пытался. Chris Bloom 25.05.2011

ruby-on-railsintegration-testingrspec2webrat

Ответы

Ответ 1 · Dty

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

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

Ответ 2 · Mark Berry

Во-первых, сообщение об ошибке заключается в том, что метод .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, но не указывает источник для этого.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы