2016-01-01 2 views
2

J'utilise les sous-types Moose pour les attributs et je veux tester (Test :: More) leur gestion correcte des entrées violant les contraintes. Actuellement, la gestion des erreurs internes de Mooses fait que mon fichier de test s'arrête complètement lorsqu'il voit les données invalides.Comment tester les messages d'erreur du sous-type Moose?

module source (réduite au minimum pour stackoverflow.com):

package Doctor; 
use Moose; 
use Moose::Util::TypeConstraints; 
subtype 'Phone_nr_t' 
    => as 'Str' 
    => where { $_ =~ /^\+?[0-9 ]+$/ } 
    => message { 'A Phone_nr must be blabla' }; 
has 'fax' => (is => 'rw', isa => 'Phone_nr_t'); 

source de test:

use Test::More tests=>1; 
use Doctor; 

my $testdoc=Doctor->new(fax=>'0341 2345678'); 
throws_ok { $testdoc->fax('123,456') } 
    qr('A Phone_nr must be blabla'), 
    'fax shall reject bad numbers'; 
+0

Bienvenue dans Stack Overflow et à la balise Perl. C'est une très bonne première question! Je suis impatient de plus. :) – simbabque

Répondre

2

S'il vous plaît use strict avant de poster sur StackOverflow. Vous n'avez pas inclus use Test::Exception; donc vous n'avez pas throws_ok. Si vous incluez que votre code fonctionne presque.

Cela fonctionne:

throws_ok { $testdoc->fax('123,456') } 
    Moose::Exception::ValidationFailedForInlineTypeConstraint, 
    'fax shall reject bad numbers'; 

également votre définition du modèle d'expression régulière est faux. Il essaie de faire correspondre des citations qui n'existent pas.

throws_ok { $testdoc->fax('123,456') } 
    qr(A Phone_nr must be blabla), 
    'fax shall reject bad numbers'; 
+1

En fait, la partie '{}' de 'qr' n'est pas le problème. Les guillemets simples à l'intérieur de l'expression sont. 'qr (foo)' ou 'qr'foo'' serait parfaitement parfait, tout comme' qr/foo/'. – simbabque

+0

J'avais 'use strict' sur mon PC (j'utilise toujours un template avec ça et plus), je l'ai juste minimisé ici (et puis la chose' Moose :: Exception :: vali ... 'a aussi besoin de guillemets). Test :: Exception manquait car j'avais compilé un perl plus récent pour utiliser Marpa. Maintenant tout va bien, les deux réponses fonctionnent. –