# Come testare metodi privati in un ActiveRecord?

**URL:** <https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999>\
**Category:** IT\
**Created:** [June 5, 2007, 2:05pm UTC](https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999 "2007-06-05T14:05:52Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [June 5, 2007, 2:05pm UTC](https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999/1 "2007-06-05T14:05:52Z")

</div>

Ciao sto provando a fare questo:

Model(monkey.rb):

class Monkey \< ActiveRecord:Base  
…  
private  
def secret; puts ‘shh’; end  
end

Test(monkey\_test.rb):

class Monkey  
def public\_secret; secret; end # creo un metodo public solo in test  
per  
poter testare il metodo privato  
end

class MonkeyTest \< Test::Unit::TestCase  
def test\_secret  
assert\_equal “shh”, Monkey.find(:first).public\_secret  
end  
end

Il problema Ã¨ che la riapertura dell’active record Monkey nella classe  
di  
test mi fa in qualche modo sparire le proprietÃ che ha originariamente  
la  
classe.  
Lanciando il test mi becco: NoMethodError: undefined method  
`primary\_key’  
for Monkey:Class.

togliendo la ridefinizione di Monkey nel test l’errore sparisce, ma  
ovviamente non riesco a testare il metodo privato…  
Qualcuno ha idee per un workaround?

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [June 5, 2007, 3:21pm UTC](https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999/2 "2007-06-05T15:21:15Z")

</div>

Paolo DonÃ ha scritto:

> Qualcuno ha idee per un workaround?

Ti racconto un segreto che non tutti sanno 🙂

class Monkey  
private  
def secret  
puts “shhh!”  
end  
end

m = Monkey.new  
m.secret  
=\> NoMethodError (private…)  
m.send(:secret)  
=\> shhh

🙂

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [June 5, 2007, 3:38pm UTC](https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999/3 "2007-06-05T15:38:19Z")

</div>

On 6/5/07, Paolo Donà [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ciao sto provando a fare questo:
> 
> togliendo la ridefinizione di Monkey nel test l’errore sparisce, ma  
> ovviamente non riesco a testare il metodo privato…  
> Qualcuno ha idee per un workaround?

il voler testare il metodo privato mi suggerisce che forse dovrebbe  
essere  
un metodo pubblico di una classe differente… magari qualcosa che sta in  
lib. altrimenti inietta al volo nell’istanza il tuo “def public\_secret”,  
così è visibile anche da test il tuo intento di violare l’encapsulation.

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [June 5, 2007, 4:38pm UTC](https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999/4 "2007-06-05T16:38:41Z")

</div>

> il voler testare il metodo privato mi suggerisce che forse dovrebbe essere  
> un metodo pubblico di una classe differente… magari qualcosa che sta in  
> lib.

Hai ragione ma non Ã¨ il mio caso. Ho un active record che fa da proxy  
ad  
una tabella legacy attraverso una relazione belongs\_to e voglio che il  
metodo di relazione (es: Monkey#legacy) sia privato in modo che solo  
Monkey  
possa usarlo. Questo fa in modo che tutta la logica di interazione con  
la  
tabella legacy sia incapsulata in Monkey ed il resto dell’applicazione  
se ne  
frega. Non posso spostare il metodo di relazione in lib… e comunque Ã¨  
anche difficile rendere privata una relazione.

altrimenti inietta al volo nell’istanza il tuo “def public\_secret”,

> cosÃ¬ Ã¨ visibile anche da test il tuo intento di violare l’encapsulation.

Si puÃ² fare ma Ã¨ na palla perchÃ¨ lo dovrei fare per ogni istanza che uso  
nel  
test… ovvero ogni volta che tiro su una fixture, non saprei come farlo  
in  
modo conciso.  
Paolo

---

<div class="post-metadata">

**Author:** ![paolodona](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/p/35a633/32.png) [@paolodona](https://www.ruby-forum.com/u/paolodona)\
**Post date:** [June 5, 2007, 3:51pm UTC](https://www.ruby-forum.com/t/come-testare-metodi-privati-in-un-activerecord/105999/5 "2007-06-05T15:51:21Z")

</div>

yep thanks, quello in effetti fuziona…  
ma la curiositÃ di sapere perchÃ¨ si spacca Ã¨ davvero troppa 🙂  
Paolo
