通过href选择具体的链接
我正在为rspec编写一个集成测试,我想测试一下,点击一个链接转到正确的模型页面。更具体地说,我想在具有相同名称但不同基础URL的链接列表上进行测试。通过href选择具体的链接
从我迄今为止所了解的情况来看,您不能在click_link中使用css属性选择器,因为它只查找特定的文本或dom ID。相反,我试图使用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
你试过click_link_within?根据文档
Works like click_link, but only looks for the link text within a given selector
这听起来像我将面临同样的问题。唯一的选择器是链接本身的href。我会试一试。 – 2011-05-24 12:45:36
“Failure/Error:click_link_within”a [href ='#{brand_path(@brand)}']“失败,@ brand.name Webrat :: NotFoundError:无法找到带有文本或标题或ID的链接”Super品牌A“',因此它必须在该链接中寻找链接。 – 2011-05-24 12:49:29
它应该与xpath一起工作,但显然在webrat中有一个错误。我不知道它是否已被修复,但是这里有一些信息和解决方法https://webrat.lighthouseapp.com/projects/10503-webrat/tickets/153-within-should-support-xpath – Dty 2011-05-24 15:58:17
首先,错误消息是.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
选择是如何工作的自己(这是我如何发现了这个问题!)。下面是我到目前为止有:
的Webrat Session对象的within
method需要selector
的说法,它使用由选择传递给Scope.from_scope,这与@selector = selector
创建一个新的会话推一个新的作用域到堆栈。到目前为止,我找不到selector
的定义。这2009 blog post说选择器可以是一个CSS类型,类或ID,但它没有引用它的来源。
这里看起来很明显的答案是只需在页面中添加更多选择器,以便我可以选择链接的父节点。如果我现在要这样做,我只会在页面中添加选择器,以便通过这一个测试。我想避免这样做。 – 2011-05-24 13:39:01
一位同事对我以前的评论有如下的评论:'[当]代码很容易测试时,这通常表明这个架构是连贯的和解耦的。纯粹为了可测试性,我肯定已经改变/重构了代码。例如,如果它确实使代码更加复杂,我肯定会更加谨慎,但是为html元素添加id并不会增加您的技术债务。如果它使代码更具可测性,我会说去做。如果元素足够重要,可以测试它是否存在,那么给它一个id或class可能就没有问题了。“要点 – 2011-05-24 21:14:20
也就是说,我仍然想知道我所尝试的是否可能。 – 2011-05-24 21:15:02