我目前使用eval
塊來測試我已經將屬性設置爲只讀。有沒有更簡單的方法來做到這一點?從工作中有沒有簡單的方法來測試Moose屬性是否只讀?
例子:
#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");
UPDATE
感謝friedo,乙醚和羅伯特·P代表他們的答案和醚,羅伯特·P和jrockway徵求意見。
我喜歡甲醚的答案如何確保$is_read_only
僅僅是一個真或假的值(即卻從CODEREF)通過用!
否定它。 Double negation也提供。因此,您可以在is()
函數中使用$is_read_only
,而無需打印出coderef。
有關最完整的答案,請參見下面的Robert P的答案。每個人都非常有幫助,並建立在彼此的答案和評論。總體而言,我認爲他對我的幫助最大,因此他現在被標記爲接受的答案。再次感謝Ether,Robert P,friedo和jrockway。
萬一你可能想知道的,當我第一次做,這裏是約get_attribute
和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.
這將是更好的寫作'OK($ snp_obj - > meta-> get_attribute('sample_for') - > get_write_method(),''sample_for'是隻讀的「);' - 在測試失敗時,is()'輸出第二個參數(這將是一個coderef )..更不用說你有第一個和第二個參數相反了:'是($ has,$ expected,$ test_name)'。 – Ether 2010-04-01 19:19:56
如果你的@attribute_names數組是精心構造的,你應該沒問題;但如果該屬性不存在,您將爆炸:) – 2010-04-02 16:55:10
+1注意如何在超類中定位屬性 – user1027562 2013-06-27 15:16:59