about private method test

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)

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

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

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