Sostituisci timestamp ripetuto con variabile nei test

1

Ho duecento test e lavoro molto con data / ora. In alcuni test, mirano al formato di output, altrove, controllo gli intervalli di date. Pertanto, i miei test hanno molti di questi:

FactoryGirl.create(:foo, ended_at: Time.zone.local(2014, 5, 5, 22, 15))

Ho pensato, forse c'è una scorciatoia per questi, dato che in alcuni file di test, lavoro solo con pochi timestamp.

FactoryGirl.create(:foo, ended_at: may_5_22_15)

Dove may_5_22_15 sarebbe definito nel metodo o usando let .

È un buon modo per andare?

Aggiornamento: altro contesto (grazie a @Snowman per indicare)

La motivazione per questo è migliorare la leggibilità di testsuite. Mi risulta più facile leggere "Foo terminato il 5 maggio alle 22:15" piuttosto che analizzare un gruppo di numeri nel costruttore di Time.

Il modello ha molti attributi data / ora (ended_at, started_at, closed_at ...) e più specifiche scrivo, più costruttori Time uso e riuso. Quindi ho pensato che potevo fare qualcosa del genere:

let(:may_5_22_15) { Time.zone.local(2014, 5, 5, 22, 15) }

Quello che mi piacerebbe sapere è se questa è una buona pratica o meno, in termini di manutenzione della suite di test, leggibilità o se ci sono dei motivi per non farlo.

    
posta rdamborsky 04.02.2015 - 23:14
fonte

3 risposte

1

Le costanti nominate sono spesso un'idea migliore dei numeri magici. In questo contesto, tuttavia, non c'è molta magia coinvolta. D'altra parte, in alcune lingue, il costruttore del valore temporale usa un valore zero-ordinale solo per alcuni dei suoi valori ( eg , il mese di JavaScript Date() numero) o comportamento illogico come accettare valori fuori intervallo come multipli non interi dell'ordine successivo più alto (di nuovo, Date() di JavaScript). In tali ambienti, una costante nominata per un timestamp ha un significato eccellente.

    
risposta data 06.02.2015 - 16:37
fonte
0

Non sono sicuro di dove sia definito il metodo ended_at , ma non vi è alcun motivo per cui non sia possibile estendi in modo che possa prendere qualsiasi tipo di stringa di input che vuoi usando Time.parse

    
risposta data 06.02.2015 - 00:13
fonte
0

Crea semplicemente un factory specifico o utilizza il valore predefinito con valore% ride% co_de, come segue:

factory :foo do
   ended_at { |foo| foo.ended_at || Time.zone.local(2014, 5, 5, 22, 15) }
end

o con ended_at blocco:

factory :foo do
   ignore do
      ended_at { Time.zone.local(2014, 5, 5, 22, 15) }
   end

   after :build do |foo, evaluator|
      foo.ended_at = evaluator.ended_at
   end
end

o passa un simbolo usuale con data / ora codificata nel suo nome:

factory :foo do
   ignore do
      ended_at { '' }
   end

   after :build do |foo, evaluator|
      foo.ended_at = Time.strptime(evaluator.ended_at, '%b_%e_%k_%M')
   end
end
    
risposta data 09.02.2015 - 19:03
fonte

Leggi altre domande sui tag