# Rails: test di un model senza accessi al DB

**URL:** <https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886>\
**Category:** IT\
**Created:** [February 8, 2011, 12:43pm UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886 "2011-02-08T12:43:40Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![luislavena](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/0ea827/32.png) [@luislavena](https://www.ruby-forum.com/u/luislavena)\
**Post date:** [February 8, 2011, 12:43pm UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886/1 "2011-02-08T12:43:40Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![tuland](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6f9a4e/32.png) [@tuland](https://www.ruby-forum.com/u/tuland)\
**Post date:** [February 8, 2011, 12:58pm UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886/2 "2011-02-08T12:58:43Z")

</div>

2011/2/8 Pippo S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> 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

---

<div class="post-metadata">

**Author:** ![tuland](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6f9a4e/32.png) [@tuland](https://www.ruby-forum.com/u/tuland)\
**Post date:** [February 8, 2011, 3:42pm UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886/3 "2011-02-08T15:42:39Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![tuland](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6f9a4e/32.png) [@tuland](https://www.ruby-forum.com/u/tuland)\
**Post date:** [February 8, 2011, 6:50pm UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886/4 "2011-02-08T18:50:31Z")

</div>

Luca De Marinis wrote in post #980267:

> 2011/2/8 Pippo S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> > 
> 
> 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?

---

<div class="post-metadata">

**Author:** ![tuland](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6f9a4e/32.png) [@tuland](https://www.ruby-forum.com/u/tuland)\
**Post date:** [February 9, 2011, 11:25am UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886/5 "2011-02-09T11:25:02Z")

</div>

2011/2/8 Pippo S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

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’ 😉

Ciao

---

<div class="post-metadata">

**Author:** ![tuland](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6f9a4e/32.png) [@tuland](https://www.ruby-forum.com/u/tuland)\
**Post date:** [February 9, 2011, 12:17pm UTC](https://www.ruby-forum.com/t/rails-test-di-un-model-senza-accessi-al-db/202886/6 "2011-02-09T12:17:23Z")

</div>

Luca De Marinis wrote in post #980522:

> 2011/2/8 Pippo S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
> 
> 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
