Mat*_*ieu 4 ruby rspec ruby-on-rails capybara ruby-on-rails-4
在我的 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>
Run Code Online (Sandbox Code Playgroud)
如何使用 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
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
syntax error, unexpected tIDENTIFIER, expecting keyword_end (SyntaxError)
Run Code Online (Sandbox Code Playgroud)
可以指定多个 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
Run Code Online (Sandbox Code Playgroud)
(我添加了#content和i选择器,以便查询更具体。)
但是,我建议不要这样做,而是尝试使测试以精确定义的方式运行,并仅测试规范中的单个类。看看this SO question及其在测试中存根或预设随机数生成器的各种方法的答案。
首先,您要检查类名,因此您需要.在类名前面添加 ,使其成为 CSS 类选择器。然后,您可以使用 RSpecor匹配器组合器
expect(page).to have_css('.glyphicon-thumbs-down').or(have_css '.glyphicon-thumbs-up')
Run Code Online (Sandbox Code Playgroud)
但它的缺点是第一个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)
Run Code Online (Sandbox Code Playgroud)
然而,使用普通 CSS 检查任一元素可能就可以了,
expect(page).to have_css('.glyphicon-thumbs-down, .glyphicon-thumbs-up')
Run Code Online (Sandbox Code Playgroud)