rails 5.1.4 assert_select'li',仅检查第一个li

时间:2018-08-06 20:14:08

标签: ruby-on-rails ruby testing

我正在Rails 5.1中进行敏捷Web开发,似乎在测试方面遇到了问题。这本书说我是否有降价之类的

<ul>
  <li>Home</li>
  <li>etc...</li>
</ul>

<ul>
  <% @cart.line_items.each do |item| %>
     <li>
       <%= item.quantity %> &times; <%= 
           item.product.title %>
     </li>
  <% end %>
</ul>

我应该能够写这段文字

assert_select 'li', '1 \u00d7 Programming Ruby 1.9'

并使其返回:true,但它仅检查第一个li元素,

Failure:LineItemsControllerTest#test_should_create_line_item [/Users/coreygibson/Documents/workspace/Depot/test/controllers/line_items_controller_test.rb:27]:
<1 \u00d7 Programming Ruby 1.9> expected but was
<Home>..
Expected 0 to be >= 1.

是否有解决此问题的设置?还是我错过了什么?这本书说这应该有用。

3 个答案:

答案 0 :(得分:1)

我对这本书不熟悉,但是从assert_select docs看来,它正在按预期工作:

  

如果第一个参数是一个元素,则以深度优先的顺序选择从(包括)该元素及其所有子级开始的所有匹配元素。   (强调我的)

由于“首页”位于单独的ul父级中,因此我不确定,但我怀疑找不到正确的li。试试这个:

assert_select 'ul' do
  assert_select 'li', '1 \u00d7 Programming Ruby 1.9'
end

答案 1 :(得分:0)

我在代码中找到了问题

import gp
import inspect

print(gp.__file__)
print(inspect.getfile(gp))

需要

assert_select 'li', '1 \u00d7 Programming Ruby 1.9'

为了正确显示\ u00d7,必须用双引号引起来。

答案 2 :(得分:0)

这里是新手错误。

用双引号替换单引号可解决此问题。

在此处添加一些原因:

  1. 单引号不能直接保存/打印转义序列,而双引号可以。 \u00d7需要转义以匹配测试结果 https://rubyinrails.com/2014/01/03/ruby-difference-between-single-and-double-quotes/

  2. 如果选择至少个元素,则asset_select断言为true。如果未找到任何元素,则第一个找到的元素将被打印在错误消息中。这就是为什么我们将<Home>视为实际结果。 https://apidock.com/rails/ActionController/Assertions/SelectorAssertions/assert_select