2010-09-07 14 views
2

Avec Test::More Je veux souvent avoir un module qui exécute des tests et a la capacité d'abandonner les appelants test_plan. J'ai une série de tests qui configurent une liste de plugins pour Catalyst::Test. Je ne veux pas avoir à faire mes tests pour voir s'ils existent; à la place, je veux que mon script avorte si ces plugins ne sont pas présents.Perl Test :: Plus et la configuration des exigences de test

J'essayais de repérer un bug dans mon Catalyst::Authentication::Store::DBI::ButMaintained, et j'ai remarqué que ce bug est également présent dans Catalyst::Authentication::Store::DBI. Ici, il est:

eval { 
    require Catalyst::Model::DBI; 
    require Catalyst::Plugin::Session; 
    require Catalyst::Plugin::Session::State::Cookie; 
    require Catalyst::Plugin::Session::Store::File; 
    require DBD::SQLite; 
    require Test::WWW::Mechanize::Catalyst; 
} or plan skip_all => [email protected]; 

... 

$ENV{'TESTAPP_PLUGINS'} = [ qw(
    Authentication 
    Session 
    Session::Store::File 
    Session::State::Cookie 
    Authorization::Roles 
) ]; 

Comme vous pouvez le voir, la eval/skip_all ne vérifie pas Authorization::Roles l'inclusion, mais le test dépend en vertu de celui-ci étant un plug-in.

J'ai une autre question cependant - existe-t-il un moyen plus élégant de spécifier des dépendances de test que cela? Gardez à l'esprit mon objectif est le même que les auteurs originaux. Je veux simplement passer le test, si les exigences de test n'existent pas. Idéalement, dans ce cas, je voudrais pirater Catalyst::Test pour envelopper le mécanisme de plugin pour Catalyst::Plugin::* choses, puis trouver une meilleure façon de faire le reste de ce genre de choses sans eval/skip_all.

Répondre

1

Vous pouvez affecter dynamiquement le nombre de tests dans le plan en appelant:

Test::More->builder->plan(tests=>$total_tests); 

Vous pouvez utiliser qui ne calcule conditionnellement nombre de tests basés sur les besoins.

+0

Ceci est intéressant, je vais jouer avec maintenant, merci pour l'information. –

+0

Pourquoi le downvote si je peux demander? – DVK

+4

Pas besoin de camper 'Test :: More-> builder',' use Test :: More; plan (tests => $ num) 'fonctionne bien. – Schwern

1

Mise à jour avec votre liste de plugins au besoin:

Si vous testez un tas d'exigences dans un paquet séparé, vous pouvez simplement avoir ce retour paquet faux (plutôt que la valeur traditionnelle vrai) si une dépendance est pas rencontré:

package Catalyst::Test; 

eval { 
    use Dep1; 
    use Dep2; 
    # ... 
} 

# dep check package returns true if we found all the modules 
[email protected]; 

# test.pl 
use Test::Requires { 
    Catalyst::Test => 0.01, # skip all tests if Catalyst::Test is not present 
}; 
use Test::More tests => 20; # call Test::More as normal. 

Quand je lance ce à l'aide d'un vérificateur dep appelé Foo, cela ne fonctionne pas avec une sortie appropriée:

 
% perl -I. foo.t 
1..0 # SKIP Foo.pm did not return a true value at (eval 4) line 2. 
# BEGIN failed--compilation aborted at (eval 4) line 2. 
# 
 
% prove -I. foo.t 
foo.pl .. skipped: Foo.pm did not return a true value at (eval 4) line 2. 
Files=1, Tests=0, 0 wallclock secs (0.02 usr 0.01 sys + 0.01 cusr 0.00 csys = 0.04 CPU) 
Result: NOTESTS 
+0

Je ne m'opposerais pas à ce que cela soit présent dans mon script de test. Mais, 'Catalyst :: Test' devrait toujours tester sa propre liste de plugin, et le script devrait sauter si ces plugins ne sont pas présents. –

+0

@Evan: mise à jour; le module référencé dans Test :: Requires peut simplement renvoyer false s'il n'est pas satisfait de l'environnement. – Ether

+0

Encore une fois, je ne suis pas sûr que retourner non-vrai est la raison pour laquelle je veux que mes scripts à SKIP, je préfère qu'ils soient beaucoup plus verbeux. Je veux que les Catalyst Plugins provoquent idéalement le saut du test d'appel s'ils ne sont pas installés - cela devrait être une caractéristique CORE de 'Catalyst :: Test' imho, et je suis intéressé par le patcher. Le reste de ce que je cherche semble déjà être présent dans 'Test :: Requires'. –