Огурец читает данные из таблицы с 3 столбцами?

Я пытаюсь прочитать данные из таблицы встроенных данных с тремя столбцами в огурце.

Файл функций:

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 строки.

Кто-нибудь знает другой способ получить доступ ко всем трем столбцам, используя объект таблицы?


person user1875703    schedule 11.11.2013    source источник


Ответы (4)


Работал для меня более простым способом, с таблицей данных из трех столбцов:

  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"]
person Joviano Dias    schedule 29.04.2016

Вы можете использовать raw для получения table, а затем используйте 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
person Justin Ko    schedule 11.11.2013
comment
Когда я добавляю |table| к своему сопоставителю, я получаю, что ваш блок принимает 1 аргумент, но регулярное выражение соответствует 0 аргументам. Что нужно изменить в файле функций, чтобы это работало (помимо добавления таблицы данных)? Спасибо - person Sawyer Merchant; 12.11.2018

Метод 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 данными.

person parad1gm    schedule 19.11.2015

Я использовал таблицу немного по-другому.

«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

Который будет печатать только значения в этом столбце.

person Rafael Porfirio    schedule 29.11.2016