Динамические данные в таблицах Cucumber

У меня есть таблица Cucumber, одно из полей - это дата, которую я хотел бы заполнить сегодняшней датой. Есть ли способ сделать это без необходимости жестко кодировать сегодняшнюю дату в таблице?

В принципе, я хотел бы ввести Time.now.strftime("%Y-%m-%d") в таблицу и не допустить, чтобы она ломалась.


person KJF    schedule 24.10.2009    source источник
comment
Примечание: да, я знаю, как нажимать на теги. Я прикидываюсь тупым, чтобы показать важность: правильного использования заглавных букв, предоставления контекста в вопросе, правильной маркировки ...   -  person PhiLho    schedule 24.10.2009
comment
Быстрый поиск в Google предполагает, что BDD и Cucumber связаны с Ruby on Rails - что может быть прозрачно очевидным, если вы двигаетесь в этих кругах, но не в том случае, если вы этого не сделаете.   -  person Jonathan Leffler    schedule 24.10.2009
comment
Огурец на самом деле относится к рубину, а не к RoR. Разработчики без рельсов используют его для тестирования своего кода. Я использую его для тестирования кода Java. И BDD не имеет отношения к Rails, это разработка через поведение, отличный от TDD (Test Driven Development) стиль.   -  person Brandon Bodnar    schedule 24.10.2009


Ответы (4)


Поскольку таблица обрабатывается определением вашего шага, вы можете поместить в таблицу специальный заполнитель, например строку «TODAYS_DATE», а затем использовать map_column! для обработки данных в столбце до нужного вам формата.

Например, учитывая следующую таблицу

Given the following user records
  | username | date        |
  | alice    | 2001-01-01  |
  | bob      | TODAYS_DATE |

В вашем определении шага у вас будет

Given /^the following user records$/ do |table|
  table.map_column!('date') do |date| 
    if date == 'TODAYS_DATE'
      date = Time.now.strftime("%Y-%m-%d")
    end
    date
  end
  table.hashes.each do |hash|
    #Whatever you need to do
  end
end

Обратите внимание, что это изменяет значения только тогда, когда вы запрашиваете хэш. table и table.raw останутся прежними, но всякий раз, когда вам понадобятся хэши строк, они будут преобразованы кодом в map_column!

person Brandon Bodnar    schedule 24.10.2009
comment
Идеально, именно то, что я искал. Спасибо. - person KJF; 24.10.2009

Я знаю, что с тех пор, как этот вопрос был задан, прошло много времени, но я недавно делал что-то подобное с Cucumber, поэтому вот альтернативное решение, если кому-то интересно ...

Given the following user records
 | username | date                             |
 | bob      | Time.now.strftime("%Y-%m-%d")    |

И затем в определении вашего шага просто eval () строка даты

Given /^the following user records$/ do |table|
  table.hashes.each do |hash|
    date = eval(hash["date"])
  end
end

Хотя, в отличие от примера Брэндона, здесь также нельзя указать точные даты без какой-либо дополнительной логики.

person Ganesh Shankar    schedule 19.04.2011
comment
Разве это не должно быть hash [date] = eval (hash [date])? это сработало для меня - person santuxus; 17.08.2012
comment
К сожалению, это не работает для случая, заданного OP, который содержит запись «2001-01-01» - это относится к 1999 году, поскольку это просто целочисленная арифметика. Вам нужно будет поместить в свою таблицу что-то вроде Date.parse ('2001-01-01'), чтобы получить общий результат. - person JESii; 29.03.2015

Ответ bodnarbm довольно хорош, если это то, что вы хотите сделать. Мое собственное предложение - взглянуть на драгоценный камень хронометража. Используйте его, чтобы установить время на известный день, а затем соответствующим образом скорректируйте свои таблицы.

person John F. Miller    schedule 24.10.2009
comment
Классная жемчужина, я определенно могу придумать, как использовать ее в моих текущих проектах кода. - person Brandon Bodnar; 24.10.2009

На основе файлов фикстур я создал этот код:

Функция:

Given the following "Inquirers":
  | id | email                    | start_date        |
  |  1 | [email protected] | <%= Time.now %>   |

Помощник:

Given(/^the following "(.*?)":$/) do |model, table|
  table.hashes.each do |hash|
    attributes = Rack::Utils.parse_nested_query(hash.to_query)
    object     = model_name.classify.constantize.new

    attributes.keys.each do |key|
      object.send("#{key}=", ERB.new(value).result())
    end
    ...
  end
end
person Raphael Almeida Araújo    schedule 17.02.2016