On Jan 11, 2008 3:49 AM, Shot (Piotr Szotkowski) <[EMAIL PROTECTED]> wrote:
> Daniel Tenner:
>
> > Might be a personal thing, but my approach is that I try to test the
> > public behaviour of the object. Testing private methods is, imho,
> > getting dangerously close to specifying how the object does its
> > business, rather than what it does.
>
> I agree on principle, but I ran into the following case in my PhD:
>
> There's a Decomposition class that decomposes an FSM to a given
> architecture. Its public methods should be new() and decompose!().
> Now, decompose!() works by running a private method by_input_sets!()
> many times with different parameters.
>
> One run of by_input_sets!() takes a couple of seconds, so can be tested;
> one run of decompose!() takes much longer, so to test decompose!()
> I should stub by_input_sets!() so it returns canned data (right?).
>
> In this situation, I think I do need to test/spec the by_input_sets!()
> private method – otherwise there would be no code that would check on
> the way it works.

In TDD there is a rule of thumb that says don't stub a method in the
same class as the method you're testing. The risk is that as the real
implementation of by_input_sets!() changes over time, it has access to
internal state that could impact the behaviour of decompose!().

It also sounds like by_input_sets!() has enough independent
responsibility that it should actually be public.

The standard approach here, which is as much a result of OO principles
as TDD, is to extract a class with the by_input_sets!() exposed as a
public method. You mock that object in your Decomposition examples and
then you have public access to by_input_sets!() on the new class.

Cheers,
David

>
> -- Shot
> --
> A school in the UK is using RFID chips in school uniforms to track
> attendance. So now it's easy to cut class; just ask someone to carry
> your shirt around the building while you're elsewhere.   -- Bruce Schneier
>
> _______________________________________________
> rspec-users mailing list
> rspec-users@rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
_______________________________________________
rspec-users mailing list
rspec-users@rubyforge.org
http://rubyforge.org/mailman/listinfo/rspec-users

Reply via email to