Rails: test di un model senza accessi al DB

Sto eseguendo uno unit test per un model che non sfrutta activeRecord e
non ha nessun accesso al DB. Quando eseguo il test mi rendo conto però
che avviene ugualmente il caricamento delle fixtures (e altre operazioni
legate all’uso del DB).

C’è un approccio adeguato (e quindi alternativo) per realizzare il test
di queste classi?
E’ consigliabile spostare queste classi in “lib”? E’ necessario operare
degli accorgimenti per testare i file in “lib”?

Scusate, ma ho un po’ di confusione a riguardo e spero che mi possiate
chiarire un po’ le idee.

Grazie

2011/2/8 Pippo S. [email protected]

Sto eseguendo uno unit test per un model che non sfrutta activeRecord e
non ha nessun accesso al DB. Quando eseguo il test mi rendo conto per
che avviene ugualmente il caricamento delle fixtures (e altre operazioni
legate all’uso del DB).

Ma il tuo model deriva da ActiveRecord::Base? in tal caso, se non e’ un
model AR, direi che ti conviene che non lo faccia!
Fatto cio’ non cerchera’ di caricarti le fixtures. Se invece sei su
rails 3
e ti servono alcune caratteristiche di ActiveRecord (tipo la validazione
o
poterle usare per le form) vedi la documentazione di ActiveModel.

C’ un approccio adeguato (e quindi alternativo) per realizzare il test
di queste classi?
E’ consigliabile spostare queste classi in “lib”? E’ necessario operare
degli accorgimenti per testare i file in “lib”?

Si, e’ consigliabile…almeno secondo me. In app/models tengo i modelli
AR,
mentre eventuali classi o moduli di supporto non persistenti stanno
meglio
in lib. Ma il test per lib/mia_classe.rb puo’ tranquillamente stare in
test/unit/mia_classe_test.rb

Ciao

Se non estendi AR non dovrebbe avere nessuna dipendenza. Non so se usi
Rails 2 o 3 ma le fixtures puoi non caricarle. Inoltre ti consiglio di
usare le Factories, tipo Machinist o factory_girl.

Non credo che per convenzione in models ci debbano stare solamente i
modelli che usano AR, infatti in alcuni progetti a cui ho lavorato nella
directory models c’erano anche semplici classi Ruby.

Luca De Marinis wrote in post #980267:

2011/2/8 Pippo S. [email protected]

Si, e’ consigliabile…almeno secondo me. In app/models tengo i modelli
AR,
mentre eventuali classi o moduli di supporto non persistenti stanno
meglio
in lib. Ma il test per lib/mia_classe.rb puo’ tranquillamente stare in
test/unit/mia_classe_test.rb

Ciao

Ho trasportato i file in lib e funziona molto bene (sia la webApp che i
test)!

Ora però ho posizionato le classi in questo modo:

lib/mia_cartella/mia_classe.rb

e ho messo i relativi test così:

test/unit/mia_cartella/mia_classe_test.rb

L’applicazione funziona correttamente ma quando lancio il test ho dei
problemi con i require all’interno delle classi (le varie classi dentro
“mia_cartella” si richiamano fra di loro). Devo prendere qualche
accorgimento?

2011/2/8 Pippo S. [email protected]

Luca De Marinis wrote in post #980267:

Ciao
test/unit/mia_cartella/mia_classe_test.rb

L’applicazione funziona correttamente ma quando lancio il test ho dei
problemi con i require all’interno delle classi (le varie classi dentro
“mia_cartella” si richiamano fra di loro). Devo prendere qualche
accorgimento?

Ti da problemi con le require o si lamenta di costanti indefinite?
spiegaci
meglio (ovvero messaggio esatto di errore, stacktrace, etc).

Ad ogni modo le due cose sono collegate ed hanno a che vedere con il
meccanismo di caricamento delle classi (che e’ in parte una
caratteristica
di ruby, arricchita da rails, e che anzi leggo che e’ cambiata in rails
3)
E’ un po’ complicato da spiegare (e per quanto riguarda rails 3 non mi
e’
chiaro neanche a me) ma semplificando molto, se la tua classe e’ nel
namespace di default (ovvero, non e’ un modulo MiaCartella, ovvero
inizia
semplicemente come

class MiaClasse

ti eviti tutta una serie di problemi spostandola in lib invece che nella
sottodirectory.

Se MiaClasse ha un nome troppo comune per poter stare nel namespace di
default, allora la devi effettivamente mettere in mia_directory ma anche
nel
namespace MiaDirectory, ovvero la tua classe conterra’ qualcosa come:

module MiaDirectory
class MiaClasse

(c’e’ da dire che se segui questa convenzione potresti addirittura
evitare
di requirare alcunche’ dato che la prima volta che rails vedra’:

MiaDirectory::MiaClasse

cerchera’ di autoloadare un file mia_directory/mia_classe.rb (partendo
da
una delle directory in load path).

Beh non saro’ stato il massimo della chiarezza temo, mi sa che ti
conviene
googlare ‘come rails carica le classi’ :wink:

Ciao

Luca De Marinis wrote in post #980522:

2011/2/8 Pippo S. [email protected]

Se MiaClasse ha un nome troppo comune per poter stare nel namespace di
default, allora la devi effettivamente mettere in mia_directory ma anche
nel
namespace MiaDirectory, ovvero la tua classe conterra’ qualcosa come:

module MiaDirectory
class MiaClasse

(c’e’ da dire che se segui questa convenzione potresti addirittura
evitare
di requirare alcunche’ dato che la prima volta che rails vedra’:

MiaDirectory::MiaClasse

Ciao

Grazie mille! Ho risolto perfettamente i problemi!
Davvero gentili e disponibili come sempre.

Grazie a tutti