2009-10-24 12 views
19

Mam tabelę Cucumber, jednym z pól jest data, którą chciałbym uzupełnić dzisiejszą datą. Czy istnieje sposób na wykonanie tego bez konieczności wprowadzania sztywnego kodu do tabeli?Dane dynamiczne w tabelach ogórków

Zasadniczo chciałbym wprowadzić do tabeli Time.now.strftime("%Y-%m-%d") i nie mieć przerwy.

+0

Uwaga: tak, wiem, jak kliknięcie na znaczniku . Gram głupio, pokazując wagę: właściwej kapitalizacji, kontekstu w pytaniu, poprawnego tagowania ... – PhiLho

+0

Szybkie wyszukiwanie w Google sugeruje, że BDD i Cucumber są powiązane z Ruby on Rails - co może być oczywiste, jeśli się poruszasz w tych kręgach, ale nie, jeśli nie. –

+3

Ogórek jest rzeczywiście związany z rubinem, a nie z RoR. Programiści niepobudliwi używają go do testowania swojego kodu. Używam go do testowania kodu Java. A BDD nie jest powiązany z Railsami, to Behavioral Driven Development, inny styl niż TDD, Test Driven Development. –

Odpowiedz

21

Ponieważ tabela jest przetwarzana według definicji kroku, można umieścić w tabeli specjalny znak miejsca, taki jak ciąg "TODAYS_DATE", a następnie użyć map_column!, aby przetworzyć dane w kolumnie do żądanego formatu .

Dla przykładu podano Poniższa tabela

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

W swojej definicji kroku trzeba

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 

Uwaga to tylko zmienia wartości, gdy prosimy o hash. table i table.raw pozostaną niezmienione, ale gdy potrzebujesz haseł wierszy, zostaną one przekonwertowane przez kod w kolumnie map_column!

+0

Doskonały, dokładnie to, czego szukałem. Dzięki. – KJF

4

Odpowiedź bodnarbm jest całkiem niezła, jeśli tak właśnie chcesz. Moja własna sugestia to przyjrzenie się timecop gem. Użyj go, aby ustawić czas na znany dzień, a następnie odpowiednio dostosuj tabele.

+0

Fajny klejnot, z pewnością można go znaleźć w moich obecnych projektach kodu. –

7

wiem, że to było wieki ponieważ pytano ale robiłem coś podobnego z ogórkiem niedawno tak oto alternatywne rozwiązanie, jeśli ktoś jest zainteresowany ...

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

I wtedy w definicji kroku tylko eval () łańcuch daty

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

Chociaż w przeciwieństwie do przykładu Brandona nie pozwoli to na wpisanie dokładnych dat bez jakiejkolwiek dalszej logiki.

+0

Ładne rozwiązanie. Lubię to. – KJF

+0

nie powinno być hash ["date"] = eval (hash ["date"])?zadziałało w ten sposób dla mnie – santuxus

+0

Niestety, to nie działa dla przypadku podanego przez PO, który zawiera wpis "2001-01-01" - to jest ewidentne do 1999, ponieważ jest to po prostu arytmetyczna liczba całkowita. Aby uzyskać ogólny wynik, musisz umieścić w tabeli coś podobnego do Date.parse ('2001-01-01') . – JESii

0

podstawie plików przynależności Stworzyłem ten kod:

Cecha:

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

Helper:

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 
Powiązane problemy