Actualmente uso un bloque eval
para probar que he establecido un atributo como de solo lectura. ¿Hay una manera más simple de hacer esto?¿Existe alguna manera simple de probar si un atributo de Moose es de solo lectura?
Ejemplo de código de trabajo:
#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");
ACTUALIZACIÓN
Gracias a Friedo, éter, y Robert P por sus respuestas y éter, Robert P, y jrockway por sus comentarios.
me gusta como la respuesta de éter asegura que $is_read_only
es más que un valor verdadero o falso (es decir, pero nunca un coderef) negándola con un !
. Double negation también proporciona eso. Por lo tanto, puede usar $is_read_only
en una función is()
, sin que imprima el valor del código.
Consulte la respuesta de Robert P a continuación para la respuesta más completa. Todos han sido muy útiles y se han basado en las respuestas y los comentarios de los demás. En general, creo que me ha ayudado más, por lo tanto, ahora está marcado como la respuesta aceptada. De nuevo, gracias a Ether, Robert P, friedo y jrockway.
En caso puede que se pregunte, como lo hice al principio, aquí es la documentación sobre la diferencia entre get_attribute
y 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.
eso sería mejor escribir como 'OK ($ snp_obj -> meta-> get_attribute ('sample_for') -> get_write_method(), "'sample_for' es de solo lectura"); '- en prueba fallida,' is() 'imprime el segundo argumento (que sería un coderef) ... sin mencionar que tiene los argumentos primero y segundo invertidos: 'is ($ has, $ expected, $ test_name)'. – Ether
Si su matriz @attribute_names está cuidadosamente construida, debería estar bien; pero si el atributo no existe explotarás :) –
+1 para saber cómo localizar el atributo en la superclase – user1027562