Как использовать регулярные выражения в таблице Cucumber (многострочный аргумент)для различия с таблицей?

Я использую таблицу сценариев (многострочные аргументы шага), чтобы проверить некоторые данные с экрана с помощью огурца, помощью встроенной .дифф! способ на огуречном столе АСТ.

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

Scenario: One
    Then the table appears as:
    | One   | Two   | Three |
    | /d+/ | /d+/ | /d+/ |

реальная таблица может выглядеть примерно так

| One | Two | Three |
| 123 | 456 | 789   |

который этот сценарий переводится на "пока есть некоторые цифры, мне все равно"

пример шаг реализация, которая терпит неудачу:

Then /^the table appears as:$/ do |expected_table|
  actual_table  = [['One','Two', 'Three'],['123', '456', '789']]
  expected_table.diff! actual_table
end

ошибка:

Then the table appears as: # features/step_definitions/my_steps.rb:230
      | One    | Two    | Three  |
      | /d+/ | /d+/ | /d+/ |
      | 123    | 456    | 789    |
      Tables were not identical (Cucumber::Ast::Table::Different)

Я попытался использовать пошаговые преобразования для преобразования ячеек в регулярные выражения, но они все еще не идентичны.

преобразовать код:

 expected_table.raw[0].each do |column|
    expected_table.map_column! column do |cell|
      if cell.respond_to? :start_with?
        if cell.start_with? "/"
          cell.to_regexp
        else
          cell
        end
      else
        cell
      end
    end
  end

который обеспечивает eror:

Then the table appears as: # features/step_definitions/my_steps.rb:228
      | One          | Two          | Three        |
      | (?-mix:d+) | (?-mix:d+) | (?-mix:d+) |
      | 123          | 456          | 789          |
      Tables were not identical (Cucumber::Ast::Table::Different)

какие идеи? Я застрял.

3 ответов


использование регулярных выражений в сценарии почти наверняка является неправильным подходом. Функции огурца предназначены для чтения и понимания заинтересованными сторонами, ориентированными на бизнес.

Как насчет написания шага на более высоком уровне, например:

Then the first three columns of the table should contain a digit

нет никакого способа сделать это, не написав свою собственную реализацию diff! метод из таблицы Ast::. Взгляните в cucumber/lib/ast/table.rb. Внутренне он использует diff-lcs библиотека для фактического сравнения, которое не поддерживает регулярное выражение.


Кажется, что вы хотите написать это таким образом, чтобы обеспечить прохладный вывод diff. В противном случае я бы посмотрел на написание этого так, что вы просто проверяете строки. Это будет не так красиво, и это не даст вам разницу всего стола, но это что-то.

Then /^the table appears as:$/ do |expected_table|
  actual_table  = [['One','Two', 'Three'],['123', '456', '789']]

  expected_table.raw.each_with_index { |row, y|
    row.each_with_index { |cell, x| 
      actual_table[x][y].should == cell
    }
  }  
end