2011-02-22

Testing your File::ShareDir based dist now possible.

For the last few months, every time I've had a dist that needed File::ShareDir to do its dirty work, I've used various tricks to make it work.
  • Simply not test it:
    Sad as this may seem, this is pretty much the primary approach because it was too confusing
  • Invest a bit of code into overriding sharedir behaviour
    This usually involved having some coderef or lazy-loaded attribute that was normally populated by File::ShareDir, instead provided during test via hard-coding it.

Enter Test::File::ShareDir

I uploaded Test::File::ShareDir this morning to CPAN, which lets you do this:
use Test::More;

use FindBin;

use Test::File::ShareDir
  -root => "$FindBin::Bin/../",
  -share => {
    -module => { 'My::Module' => 'share/MyModule' }
  };
This configuration would be sufficient to use in a test in t/ for a distribution shipping My::Module along with its corresponding shared directory share/MyModule. If you were shipping this dist with Dist::Zilla, you'd have something like this in dist.ini
[ModuleShareDirs]
My::Module = share/MyModule
I plan to add support for 'package' style ShareDir support, but for now, module share dirs are sufficient. Enjoy =).

1 comment:

  1. I've wrapped the dist_file call in a try/catch block and fall back to ./share in the catch block.
    That lets me run the app without being installed on my dev box.

    ReplyDelete