Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

[solved] Test question: how to exercise conditional module load?

by radiantmatrix (Parson)
on Jun 17, 2008 at 19:54 UTC ( #692580=perlquestion: print w/ replies, xml ) Need Help??
radiantmatrix has asked for the wisdom of the Perl Monks concerning the following question:

I like to use Devel::Cover to make sure that my test suite adequately covers my code. I've run into a bit of a conundrum on how to test something.

BEGIN { eval { require YAML::Syck; YAML::Syck->import }; #1 if ($@) { require YAML; YAML->import; #2 } }

Yes, I know I could use Best (use Best qw/YAML::Syck YAML/;), but for this project, it's not an option due to bureaucratic considerations.

My problem is that my tests only exercise the statements in #1, and not in #2 -- or vice-versa. I'm looking for a way that my test script can, e.g. temporarily make require YAML::Syck or YAML::Syck->import die so that I can automatically prove the fallback works.

I have tried to search for answers, but can't seem to find a set of search terms that provides any enlightenment. So, I turn to the Monestary: any ideas?

Updates:

<radiant.matrix>
Ramblings and references
“A positive attitude may not solve all your problems, but it will annoy enough people to make it worth the effort.” Herm Albright
I haven't found a problem yet that can't be solved by a well-placed trebuchet

Comment on [solved] Test question: how to exercise conditional module load?
Select or Download Code
Replies are listed 'Best First'.
Re: Test question: how to exercise conditional module load?
by Corion (Pope) on Jun 17, 2008 at 19:58 UTC

    You can always fake things in Perl:

    $INC{YAML::Syck} = 1; # fake that YAML::Syck is loaded sub YAML::Syck::import { die }; # but make the ->import call fail require Your::Module; # Now it will try to use YAML

    You can also use my module, Test::Without::Module, but there are other modules as well for testing in the absence of modules.

      Thanks! It didn't work quite perfectly as provided, but it was enough info to get me a working solution:

      { local %INC; delete $INC{YAML.pm}; # make sure YAML isn't loaded $INC{'YAML/Syck.pm'} = 1; # fake loading of YAML::Syck sub YAML::Syck::import { die } require My::Module; ok( $INC{'YAML.pm'}, 'YAML loaded when YAML::Syck not present' ); }

      Thanks again!

      <radiant.matrix>
      Ramblings and references
      “A positive attitude may not solve all your problems, but it will annoy enough people to make it worth the effort.” Herm Albright
      I haven't found a problem yet that can't be solved by a well-placed trebuchet

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://692580]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (15)
As of 2015-07-30 17:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (273 votes), past polls