在我的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)
答案 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
(我添加了#content
和i
选择器,以便查询更具体。)
但是,我建议尝试以精确定义的方式运行测试并仅测试规范中的单个类,而不是这样做。查看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