2009-11-11 6 views
1

Salutations,« ne peut pas appeler la méthode « chemin_rép » sur une valeur indéfinie » lors de l'exécution composant Mason sur la ligne de commande

Je suis en train de développer des tests pour les composants Mason qui nécessite de les exécuter sur la ligne de commande au lieu du serveur web. Lorsque je tente, je reçois une erreur:

perl -MHTML::Mason::Request -MHTML::Mason::Interp -I./lib \ 
-e '$int = HTML::Mason::Interp->new(data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps"); $m = HTML::Mason::Request->new(comp => "/dummy", interp => $int); $m->comp("/dummy")' 

Résultats dans:

Can't call method "dir_path" on an undefined value at lib/HTML/Mason/Request.pm line 1123. 

L'erreur est levée lorsque l'appel à ->comp est tentée. Je n'arrive pas à comprendre ce qui ne va pas avec la configuration. Le composant est là et semble être compilé très bien, et cela fonctionne via Apache.

Ceci utilise HTML :: Mason 1.35.

Modifier: Essayons une prime pour celui-ci. L'alternative est que je dois plonger profondément dans les tripes de Mason! :)

Modifier à nouveau: Merci beaucoup à David pour avoir souligné le détail crucial que j'ai manqué pour que cela fonctionne. Il s'agissait en fait d'un framework de test qui nécessitait l'utilisation d'un module appelant certains composants Mason. En fonctionnement normal, le module est fourni avec un objet de requête Mason à utiliser à cette fin, mais je n'ai pas pu le faire. déconnecté de travail. La clé a été à l'aide d'un objet interprète à la place, donc j'ai fini par faire ce qui suit, qui est un peu idiot, mais fait les tests de travail:

sub _mason_out { 
    ... 
    my $buf; 
    if ($ENV{MASON_TEST}) { 
     my $int = HTML::Mason::Interp->new(comp_root => $self->{env}->comp_dir, 
              out_method => \$buf); 

     $int->exec($comp, %args); 
    } else { 
     my $m = $self->{mason_object}; 
     $m->comp({ store => \$buf }, $comp, %args); 
    } 

    return $buf; 
} 

Répondre

2

Je pense que cela ne fonctionne pas parce que votre demande objet n'a pas construit une pile composant au point d'être appelé. Utilisez la méthode Interp->exec() à la place comme décrit dans Using Mason from a Standalone Script

perl -MHTML::Mason::Interp -I./lib \ 
-e 'HTML::Mason::Interp->new(data_dir => "/home/friedo/cache", comp_root => "/home/friedo/comps")->exec("/dummy")' 
+0

Merci! C'était la pièce manquante du puzzle que j'ai en quelque sorte oublié dans les docs. +200 pour vous. Également mis à jour la question avec quelques détails sur l'image plus grande. – friedo

Questions connexes