Rspec / capybara - 测试一个类或另一个类的存在

时间:2017-05-27 22:39:08

标签: ruby-on-rails ruby ruby-on-rails-4 rspec capybara

在我的ruby on Rails 4.2应用程序中,在页面上我有一个条件后端规则,该规则在类中的更改中转换为页面前端

<div id="content">
    <i class='<% if x=true %>glyphicon glyphicon-thumbs-down<% else> glyphicon glyphicon-thumbs-up ><% end %>' </i>
       this is the message.
</div>

如何检查存在与rspec 3 / capybara页面包含类glyphicon-thumbs-down或类glyphicon-thumbs-up?

我尝试了下面的代码,但它失败了:

it "should sheck one of the 2 classes presence" do
  expect(page).to have_css '.glyphicon-thumbs-down' || expect(page).to have_css '.glyphicon-thumbs-up'
end

我收到以下错误消息:

syntax error, unexpected tIDENTIFIER, expecting keyword_end (SyntaxError)

4 个答案:

答案 0 :(得分:3)

可以用逗号分隔多个OR-ed css选择器。请尝试以下方法:

it "should sheck one of the 2 classes presence" do
  expect(page).to have_css '#content i.glyphicon-thumbs-down,#content i.glyphicon-thumbs-up'
end

(我添加了#contenti选择器,以便查询更具体。)

但是,我建议尝试以精确定义的方式运行测试并仅测试规范中的单个类,而不是这样做。查看this SO question及其答案,了解在测试中存根或预设随机数生成器的各种方法。

答案 1 :(得分:3)

首先,您要检查类名,以便在类名前面需要.,以使其成为CSS类选择器。然后,您可以使用RSpec or匹配组合器

expect(page).to have_css('.glyphicon-thumbs-down').or(have_css '.glyphicon-thumbs-up')

但是在检查第二个之前,它有第一个重试/等待Capybara.default_max_wait_time秒的缺点。如果您知道页面已经加载,则可以指定0 / false等待时间,因此不需要重试/等待

 expect(page).to have_css('.glyphicon-thumbs-down', wait: false).or(have_css '.glyphicon-thumbs-up', wait: false)

但是,使用普通的CSS ,

检查这两个元素可能很好
 expect(page).to have_css('.glyphicon-thumbs-down, .glyphicon-thumbs-up')

答案 2 :(得分:0)

您的错误来自此行:

  expect(page).to have_css 'glyphicon-thumbs-down' || expect(page).to have_css 'glyphicon-thumbs-up'

你只需要添加一些parens然后它将是有效的语法:

expect(page).to(have_css('glyphicon-thumbs-down')) || expect(page).to(have_css('glyphicon-thumbs-up'))

这不会解决你的问题,因为如果左边条件失败,那么rspec将退出而不会运行下半部分。

一种工作方法可以是将条件评估为布尔变量,然后将其传递给单个rspec期望。这样做需要使用核心Capybara方法has_css来测试css存在,而不是来自rspec匹配器包的have_css?

selectors = ['.glyphicon-thumbs-down', '.glyphicon-thumbs-up']
glyph_exists = selectors.any? do |selector|
  page.has_css? selector
end
expect(glyph_exists).to be true

另请注意,我已将.添加到选择器字符串中,这是必需的,因为它是一个css类。

答案 3 :(得分:0)

也许您可以在这样的期望方法中尝试使用:count选项:

it 'should contains 2 same selector' do
  expect(page).to have_css '.some-class', count: 2
end