Краставица чете данни от таблица с 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, за да получите таблица и след това използвайте 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