water has asked for the wisdom of the Perl Monks concerning the following question:

Hi -- I am using MockObjects to unit test an app that uses Class::DBI objects. Many of my routines use the stringification properties of CDBI. When my mock object gets stringified, it becomes T::MO::E::a=HASH(0x8362fc8) or whatver. How can I add stringification to my mock objects? Thanks

Water -- Gotta Have It

Replies are listed 'Best First'.
Re: Stringification of MockObjects
by stvn (Monsignor) on May 20, 2004 at 01:03 UTC

    I assume you are building your own Mock Objects, and not using Test::MockObject. In which case, all you need to do to automatically stringify your object is to make them overload the "" operator.

    # assuming there is a stringify method # that does the right thing use overload ('""' => \&stringify);
    I think this will do what you are looking for.

    -stvn
      Errrr.... I am using Test::MockObject::Extends, in fact.

      Your point is that if I'm handrolling my own mocks, I just overload it like any other object, yes? If that is your point, then, yes, I get what you are saying and I agree -- but I am following the Virtue of Laziness and using T:MO:E.

      Suggestions for my case, beyond "roll-your-own"?

        To be honest, I am not all that familiar with Test::MockObject, as I have yet to find a situation to use it in. Am I right in assuming that you are using Test::MockObject::Extends to mock parts of Class::DBI objects? Or is it to mock other objects?

        One possiblity might be to move your mock objects down a level, and use DBD::Mock as a faux-database, rather than mocking Class::DBI (if that is indeed what you are doing)? This would allow you to use Class::DBI as you would normally. Personally, I like to mock as little as possible, and as "low to the ground" as possible (database, network connection, etc.).

        But I am just making assumptions here, if you want to provide more info about exactly what it is you are trying to do, I might be able to help more. And of course you could always try messaging chromatic, since he is the one who wrote Test::MockObject in the first place.

        -stvn
Re: Stringification of MockObjects
by chromatic (Archbishop) on May 20, 2004 at 06:38 UTC

    Beats me, though it's very close to bedtime here. I tried the following to no avail:

    my $tmoe = Test::MockObject::Extends->new( $foo ); overload::OVERLOAD( ref $tmoe, '""' => sub { "mock stringy\n" }, 'fallback' => sub { "default mock overload\n" } );

    My guess is that the magic's not registering properly, though I have no idea why that should be. Calling ("" directly works.

      so..........

      am i out of luck?

      the serious magic of M:O:E are well beyond this Water's small brain...

      what ought I try next?