2017-01-25 101 views
0

我正在使用CPAN的Test模塊編寫測試腳本。我希望腳本測試以查看我的程序是否加載了URI :: URL包。這可能嗎?編寫測試以確保Perl腳本加載特定模塊

+0

Test :: More has ['use_ok'](https://metacpan.org/pod/Test::More#Module-tests)and'require_ok' ...是否有任何特殊原因您正在使用Test .pm而不是Test :: More?測試::更多是非常標準的。 – ThisSuitIsBlackNot

+0

我正在使用'Test :: More'。我確實嘗試過這些測試,但他們似乎只看到我的測試腳本是否可以加載軟件包。我想測試從另一個文件運行的目標腳本是否正在加載軟件包。 – StevieD

回答

3

如果我正確理解你,你想檢查一段代碼是否加載某個模塊。

你可以通過運行一段代碼,然後檢查%INC算賬:

# run your script (e.g. via 'do' or 'require') 
# ... 

ok $INC{'URI/URL.pm'}, "URI::URL was loaded"; 
4

這可能是更好地使用該模塊Module::Loaded,而不是分析%INC的。從perl 5.9.4開始它是一個核心模塊。

http://perldoc.perl.org/Module/Loaded.html

use Module::Loaded; 

if (is_loaded('URI::URL')) { 
    print "Is loaded\n"; 
} else { 
    print "Is NOT loaded\n"; 
} 

希望能解決你的問題。

+0

這在此上下文中正常工作,但要注意:在列表上下文中,「is_loaded」在失敗(而不是false)時不返回任何內容(空列表)。這種奇怪的行爲是沒有記錄的,可以讓你絆倒你:'foo(is_loaded(「Weird :: Stuff」))'實際上沒有參數地調用'foo()'。 – melpomene

+0

@zdim在你做類似'my%hash =(foo => 1,bar => is_loaded($ module),baz => 2)'然後'is_loaded'突然返回一個空列表並且您的後續密鑰成爲值,反之亦然。然後,您的bugzilla或CGI代碼中會出現安全漏洞(請參閱臭名昭着的「Perl Jam」討論)。那裏的罪魁禍首是'$ cgi-> param()',至少有文件記錄返回一個列表! – melpomene

+0

@zdim不,如果'is_loaded'總是返回一個標量(包括'undef'),一切都很好。 – melpomene