J'utilise actuellement un bloc eval
pour tester que j'ai défini un attribut en lecture seule. Existe-t-il un moyen plus simple de faire cela?Existe-t-il un moyen simple de tester si un attribut Moose est en lecture seule?
Exemple de code de travail:
#Test that sample_for is ready only
eval { $snp_obj->sample_for('t/sample_manifest2.txt');};
like([email protected], qr/read-only/xms, "'sample_for' is read-only");
MISE À JOUR
Merci à Friedo, l'éther et Robert P pour leurs réponses et à l'éther, Robert P, et jrockway pour leurs commentaires.
J'aime la façon dont la réponse de l'éther assure que $is_read_only
est seulement une valeur vraie ou fausse (à savoir, mais jamais un coderef) en niant avec un !
. Double negation fournit également cela. Ainsi, vous pouvez utiliser $is_read_only
dans une fonction is()
, sans imprimer le coderef.
Voir la réponse de Robert P ci-dessous pour la réponse la plus complète. Tout le monde a été très utile et s'est appuyé sur les réponses et les commentaires des uns et des autres. Dans l'ensemble, je pense qu'il m'a aidé le plus, d'où son est maintenant marqué la réponse acceptée. Encore une fois, merci à Ether, Robert P, friedo et jrockway.
Si vous demandez peut-être, comme je l'ai fait tout d'abord, voici la documentation sur la différence entre get_attribute
et find_attribute_by_name
(from Class::MOP::Class):
$metaclass->get_attribute($attribute_name)
This will return a Class::MOP::Attribute for the specified $attribute_name. If the
class does not have the specified attribute, it returns undef.
NOTE that get_attribute does not search superclasses, for that you need to use
find_attribute_by_name.
Ce serait mieux écrit que 'ok (snp_obj $ -> meta-> get_attribute ('sample_for') -> get_write_method(), "'sample_for' est en lecture seule"); - en cas d'échec du test, 'is()' affiche le 2ème argument (qui serait un coderef) .. sans mentionner que vous avez les 1er et 2ème arguments inversés: 'is ($ has, $ expected, $ test_name)'. – Ether
Si votre tableau @attribute_names est construit avec soin, ça devrait aller; mais si l'attribut n'existe pas, vous exploserez :) –
+1 pour avoir remarqué comment localiser l'attribut dans la superclasse – user1027562