2009-10-24 3 views
19

Ho una tabella Cucumber, uno dei campi è una data che desidero aver popolato con la data di oggi. C'è un modo per farlo senza dover inserire la data odierna sul tavolo?Dati dinamici in tabelle Cucumber

Fondamentalmente, desidero inserire Time.now.strftime("%Y-%m-%d") nel tavolo e non interromperlo.

+0

Nota: Sì, lo so come fare clic su un tag . Sto giocando stupidamente per mostrare l'importanza di: corretta capitalizzazione, fornendo contesto in una domanda, tagging corretto ... – PhiLho

+0

Una rapida ricerca con Google suggerisce che BDD e Cucumber sono legati a Ruby on Rails - che potrebbe essere chiaramente ovvio se ti sposti in quei cerchi ma non se non lo fai. –

+3

Il cetriolo è in realtà correlato al rubino, non al RoR. Gli sviluppatori non rails lo usano per testare il loro codice. Lo uso per testare il codice Java. E BDD non è legato a Rails, è uno sviluppo comportamentale, uno stile diverso rispetto a TDD, Test Driven Development. –

risposta

21

Poiché la tabella viene elaborata dalla definizione del passo, è possibile inserire un segnaposto speciale nella tabella, ad esempio la stringa "TODAYS_DATE", quindi utilizzare map_column! per elaborare i dati nella colonna nel formato desiderato .

Ad esempio dato la seguente tabella

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

nella definizione fase si avrebbe

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 

Nota questa modifica solo i valori quando si chiede l'hash. table e table.raw rimarranno gli stessi, ma ogni volta che avrai bisogno degli hash di riga, saranno convertiti dal codice all'interno di map_column!

+0

Perfetto, esattamente quello che stavo cercando. Grazie. – KJF

4

La risposta di bodnarbm è abbastanza buona se è quello che vuoi fare. Il mio suggerimento sarebbe di dare un'occhiata allo timecop gem. Usalo per impostare il tempo per un giorno noto, quindi aggiusta le tabelle di conseguenza.

+0

Cool gem, posso sicuramente pensare ad alcuni usi per questo nei miei progetti di codice corrente. –

7

io so che è stato secoli da quando questa domanda è stato chiesto, ma mi stava facendo qualcosa di simile con cetriolo recentemente quindi ecco una soluzione alternativa, se qualcuno è interessato ...

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

E poi nella definizione fase appena eval () la stringa della data

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

anche se a differenza ad esempio di Brandon questo voleva far si mette in date esatte anche senza qualche ulteriore logica.

+0

Bella soluzione. Mi piace questo. – KJF

+0

non dovrebbe essere hash ["date"] = eval (hash ["date"])?ha funzionato in quel modo per me – santuxus

+0

Sfortunatamente, questo non funziona per il caso dato dall'OP che contiene una voce '2001-01-01' - questa differenza è del 1999 in quanto è solo una semplice aritmetica dei numeri interi. Dovresti inserire qualcosa come Date.parse ('2001-01-01') nella tua tabella per ottenere il risultato generale. – JESii

0

Sulla base di file infissi Ho creato questo codice:

Caratteristica:

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