Come testare named_scopes e metodi di ricerca?
-
06-07-2019 - |
Domanda
Quando ho saputo di proxy_options ho iniziato a usarlo per testare tutti i miei ambiti nominati. Ma poi mi sono ritrovato a copiare l'hash delle condizioni direttamente dal modello, quindi non stava davvero testando la correttezza dei risultati:
po = {:conditions => "foo.created_at <= '#{Time.now.beginning_of_week}'"}
assert_equal po, Foo.created_this_week
Un altro approccio è quello di trovare esempi positivi e negativi e vedere se sono inclusi nei risultati o meno:
this_week = Foo.make(:created_at => Time.now)
last_week = Foo.make(:created_at => 1.week.ago)
assert Foo.created_this_week.include?(this_week)
assert !Foo.created_this_week.include?(last_week)
Ma questo non fa un buon lavoro nel controllare i confini e quando le cose si complicano avrai un lungo elenco di affermazioni incluse. Sembra che sarebbe più bello trovare un insieme atteso di risultati e quindi controllare per assicurarsi che corrisponda:
Foo.make(:created_at => 1.week.ago)
results = [Foo.make(:created_at => Time.now)]
assert_equal results, Foo.created_this_week
Ma il test potrebbe non riuscire se i risultati vengono restituiti in un ordine diverso da quello fornito. Suppongo che potresti implementare & Lt; = & Gt; nel modello in modo da poter ordinare entrambi gli array. Ma sembra che non dovrebbe essere davvero necessario. Esiste un modo migliore per testare questo tipo di metodi di ricerca? O almeno un modo giusto generalmente accettato?
Soluzione
Penso di essere giunto alla conclusione che non esiste " generalmente accettato nel modo giusto " per fare questo.
Immagino che la mia soluzione personale sarà quella di smettere di testare semplici named_scopes e usare l'assert include? metodo per testare funzionalità di ricerca più complicate.