# About private method test

**URL:** <https://www.ruby-forum.com/t/about-private-method-test/153297>\
**Category:** Rails\
**Created:** [November 14, 2008, 4:17pm UTC](https://www.ruby-forum.com/t/about-private-method-test/153297 "2008-11-14T16:17:23Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 14, 2008, 4:17pm UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/1 "2008-11-14T16:17:23Z")

</div>

For the methods defined as private,we need to test it?  
For the reason that the private methods are used within the public  
methods,so we need not to test the private methods as long as the  
public methods are tested?

---

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 14, 2008, 4:57pm UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/2 "2008-11-14T16:57:52Z")

</div>

it’s up to you. if you’re satisfied that the private method is  
working properly in the course of testing the public methods then  
fine, otherwise you should be able to call the private method like:

@my\_object.send(:private\_method\_name, arg1, arg2)

---

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 14, 2008, 5:01pm UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/3 "2008-11-14T17:01:33Z")

</div>

daociyiyou wrote:

> For the methods defined as private,we need to test it?  
> For the reason that the private methods are used within the public  
> methods,so we need not to test the private methods as long as the  
> public methods are tested?

A very clear discussion of the topic by one of the best testers in the  
Ruby world (in my opinion):

> **[eli.st](http://evang.eli.st/blog/2008/10/27/testing-protected-and-private-methods-in-ruby)**
>
> This domain may be for sale!

HTH  
Paul

---

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 14, 2008, 5:27pm UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/4 "2008-11-14T17:27:42Z")

</div>

Jeff Emminger wrote:

> it’s up to you. if you’re satisfied that the private method is  
> working properly in the course of testing the public methods then  
> fine, otherwise you should be able to call the private method like:
> 
> @my\_object.send(:private\_method\_name, arg1, arg2)

I believe that I read somewhere that a future version of Ruby will be  
“fixed” to not allow using “send” to call private and protected methods.  
Which is really the behavior it should have had in the first place.  
Allowing this breaks the rules of encapsulation.

A test case class is external to the class being tested, and like any  
other class SHOULD NOT have access to private data. Given that a private  
method should only ever be called from inside the confines of the class  
then you must access them via the public API and therefore tested though  
that public API.

Test cases are clients of classes being tested in the same way any other  
class would be a client. This means that your tests, or specs, should  
test the behavior of the class through that same API. Theses tests  
should therefore be complete enough to exercise the “behavior” of the  
underlying private data and methods of the class being tested.

At least this is my own understanding. Feel free to disagree…

---

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 16, 2008, 10:54am UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/5 "2008-11-16T10:54:56Z")

</div>

Thank you very much! I have understood it very clearly.

---

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 14, 2008, 11:08pm UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/6 "2008-11-14T23:08:37Z")

</div>

On Nov 14, 11:27 am, Robert W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Allowing this breaks the rules of encapsulation.  
> should therefore be complete enough to exercise the “behavior” of the  
> underlying private data and methods of the class being tested.
> 
> ## At least this is my own understanding. Feel free to disagree…

Yeah, that’s probably the better route. If you’re resorting to  
calling a protected or private method directly, then you either aren’t  
testing the public methods well enough or you haven’t designed the  
software well enough

---

<div class="post-metadata">

**Author:** ![daociyiyou](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/0ea827/32.png) [@daociyiyou](https://www.ruby-forum.com/u/daociyiyou)\
**Post date:** [November 16, 2008, 10:55am UTC](https://www.ruby-forum.com/t/about-private-method-test/153297/7 "2008-11-16T10:55:32Z")

</div>

Thank you very much! I have understood it very clearly.
