В настоящее время я использую блок eval
, чтобы проверить, что я установил атрибут только для чтения.Есть ли более простой способ сделать это?
Пример из рабочего кода:
#Test that sample_for is ready only
eval { $snp_obj->sample_for('t/sample_manifest2.txt');};
like($@, qr/read-only/xms, "'sample_for' is read-only");
ОБНОВЛЕНИЕ
Благодаряfriedo, Ether и Robert P за их ответы и Ether, Robert P и jrockway за их комментарии.
Мне нравится, как ответ Ether гарантирует, что $is_read_only
является только истинным илиложное значение (т. е. но не кодовая ссылка), отрицая его с помощью !
. Двойное отрицание также обеспечивает это.Таким образом, вы можете использовать $is_read_only
в функции is()
, не печатая кодовую ссылку.
См. Ответ Роберта П. ниже для наиболее полного ответа.Все были очень полезны и опирались на ответы и комментарии друг друга.В целом, я думаю, что он помог мне больше всего, следовательно, теперь он помечен как принятый ответ.Опять же, благодаря Ether, Robert P, friedo и jrockway.
На случай, если вам интересно, как я это делал сначала, вот документация о разнице между get_attribute
иfind_attribute_by_name
( из класса :: 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.