Как использовать регулярные выражения в таблице 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