1

我正在尝试从黄瓜中的三列内联数据表中读取数据。

功能文件:

Then  I should see grades,exteriors, interiors and engines available:
  |grades            |exteriors         |  engine |
  |xdata-id-Elegance |xdata-id-NH-788p  |  12345  |
  |                  |xdata-id-NH737M   |         |
  |                  |xdata-id-NH731P   |         |
  |                  |xdata-id-R-539P   |         |

步骤定义:

 Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
      data = table.rows_hash
      puts data['exteriors']
    end

这给了我只允许 2 行的错误。

有谁知道我可以使用表格对象访问所有三列的另一种方式?

4

4 回答 4

3

以更简单的方式为我工作,使用三列数据表:

  Scenario: I am able to select a date range

    Given I am on the rejections tracker page as a superuser
    Then the date range filters work as expected
      | dateFrom   | dateTo     | variance    |
      | 12/05/2014 | null       | lesser than |
      | null       | 12/07/2014 | lesser than |
      | null       | null       | equal to    |

这对我有用:

    Then(/^the date range filters work as expected$/) do |table|

      data = table.hashes
      date_from = []
      date_to = []
      variance = []

      data.each do |row|
        row.each do |key, value|
          if key.eql? "dateFrom"
            date_from << value
          elsif key.eql? "dateTo"
            date_to << value
          elsif key.eql? "variance"
            variance << value
          end
        end
      end

      puts date_from
      puts date_to
      puts variance
   end

输出:

  ["12/05/2014", "null", "null"]
  ["null", "12/07/2014", "null"]
  ["lesser than", "lesser than", "equal to"]
于 2016-04-29T13:51:14.093 回答
2

您可以使用raw来获取表格,然后使用 Ruby 将其操作为您想要的表格。

例如,下面显示了如何获取表,然后将其转换为哈希,其中键是列标题,值是该列中值的数组。

Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
    data = table.transpose.raw.inject({}) do |hash, column| 
        column.reject!(&:empty?)
        hash[column.shift] = column
        hash    
    end

    p data['grades']
    #=> ["xdata-id-Elegance"]
    p data['exteriors']
    #=> ["xdata-id-NH-788p", "xdata-id-NH737M", "xdata-id-NH731P", "xdata-id-R-539P"]
    p data['engine']
    #=> ["12345"]
end
于 2013-11-11T15:52:35.133 回答
0

rows_hash方法适用于特定类型的表。具体来说,它适用于有两列的表格,标题在左列。例如:

|grades   |xdata-id-Elegance|
|exteriors|xdata-id-NH-788p |
|engine   |12345            |

但是,您的数据不止一行,因此您使用的是正确类型的表格。

您可以改用常规hashes方法,该方法将返回一个哈希数组,然后从中提取您需要的数据。例如:

Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
  data = table.hashes

  exteriors = []

  data.each do |row|
    row.each do |key, value|
      exteriors << value if key == 'exteriors'
    end
  end

  puts exteriors
end

此代码创建一个名为的空数组exteriors,然后迭代data数组中的每个值,这又是一个哈希,对应于原始表中的非标题行。这些哈希中的每一个都代表表中某一行的值,使用标题作为键。

对于表中的每个非标题行,它会遍历散列并exteriors用数据填充数组。

于 2015-11-19T15:08:30.053 回答
0

我以稍微不同的方式使用了这张桌子。

“table.hashes”将表格行分解为数组,这样访问起来很容易。

所以我们可以像这样访问第一行:

puts data[0]

这将导致: {"grades"=>"xdata-id-Elegance", "exteriors"=>"xdata-id-NH-788p", "engine"=>"12345"}

然后可以遍历对象并使用“.each”打印所有对象,如下所示:

data.each do |row|
puts row
end

这将基本上打印分组到数组中的表中的所有值(这是您的行)。所以前面提到了一堆结果。

现在也有可能直接访问您想要的密钥,只需执行以下操作:

data.each do |row|
puts row["exteriors"]
end

它将仅打印该列中的值。

于 2016-11-29T13:19:17.117 回答