Hi Michael, et al,
Personally, unless I have a very complicated (and therefore unusual)
test setup, simply putting .pm files directly in t/ works just fine.
Then a simple "use lib './t'" does the trick. `prove`, `make test` and
even Test::Harness::run_tests(glob 't/*.t') ignore anything but .t
files, and are basically always [TMK] executed from your package's
base directory. So, seeing files ending in .pm inside a t/ directory,
makes their purpose and contents completely unambiguous IMO.
I'm not sure I understand the concern about chdir(). Since "use lib"
is a compile time directive, then whether your code chdir()s at run
time or not seems to me to be a moot point. ??
Yet-Another [cross-platform-compatible] possibility, which [TMK] works
around your cited chdir() issue is to do the following.
<code>
BEGIN {
use Cwd 'abs_path';
use File::Spec;
my ($vol, $dir) = File::Spec->splitpath(abs_path($0)); # use
script name to find t/
push @INC, $vol.$dir;
}
</code>
Cheers,
--
Shaun Fryer
http://sourcery.ca/
On Mon, Jul 6, 2009 at 4:59 PM, Michael G Schwern<[email protected]> wrote:
> David Golden wrote:
>> On Sun, Jul 5, 2009 at 9:40 PM, Buddy Burden<[email protected]> wrote:
>>> Let's say I have some common functions that I want available to all my
>>> .t files. So I've created a module that all the .t files can include.
>>> But where do I put it? I don't want to put it in lib/ because I
>>> don't want it to get installed, right? But when I put it in t/, make
>>> test can't seem to find it.
>>
>> I tend to see three variations.
>
> They're all fine. Here's my opinions.
>
>
>> (1) put it in t/lib/MyTest.pm and "use lib 't/lib'" at the start of
>> your test files
>
> This is my preferred way of doing things. Using lib::abs avoids any problems
> if your test code has to chdir().
>
>
>> (2) put it in t/MyTest.pm and "use lib 't'" at the start of your test files
>
> I don't like this because it clutters up the test directory. We have
> subdirectories for a reason.
>
>
>> (3) either of the above but "use t::MyTest" rather than changing @INC
>> with "use lib..."
>
> Has all the problems of #2, plus it wields your testing module to the t/
> directory. If you want to move it or package it into its own dist you have to
> change the package name. If its a class you're writing "t::MyTest->...".
>
> If for some reason your code has to chdir() before loading the module there's
> no way to compensate for that.
>
>
>> I don't think any one is much better than the others. I tend to like
>> the "t::MyTest" approach from a readability standpoint because it's
>> clear within the *.t file that this is a test library and it's clear
>> where to locate it.
>
>
>
> --
> A: Yes.
>> Q: Are you sure?
>>> A: Because it reverses the logical flow of conversation.
>>>> Q: Why is top posting annoying in email?
>