2017-01-25 100 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