【问题标题】:How to pass Arguments when call require_ok '*.pl' to test by Test::More调用 require_ok '*.pl' 以通过 Test::More 进行测试时如何传递参数
【发布时间】:2020-04-24 13:01:12
【问题描述】:

我想知道如何单独测试 *.pl 文件中的每个子路由。 但不能使用 'require' 子句,因为某些 *.pl 需要参数。

例如

use Test::More;
require "some.pl"

在“要求”处测试总是会失败。
因为“some.pl”需要一个参数并以

结尾
exit(0);

文件。

我只想单独测试“*.pl”中的每个子路由“Func1,usage,...whatever”。

some.pl 就是这样的

my ( $cmd) = @ARGV;  
if (!defined $cmd ) {
    usage();
} else {
    &Func1;
}
exit(0);

sub Func1 {
      print "hello";
    }

sub usage {
     print "Usage:\n",
    }

如何通过“Test::More”为“sub Func1”编写测试代码?

任何建议表示赞赏。

【问题讨论】:

  • 您要测试Func1 的目的是什么?它不返回任何值。你想做什么? Test::Simple - tutorial
  • 感谢评论,极地。我的道歉解释不佳。更新我的问题。仍然需要你的帮助。谢谢
  • 不过,您在问题中的评论并不清楚。通常会编写测试来验证模块功能是否正确产生结果。由于某个函数的规则返回值与预期值进行比较——如果返回值匹配 es 则它通过了测试。在您的情况下,两个函数都在终端中打印一些字符串并且没有返回值。或者你只是想看看它们是否完成了它们的功能——在一种情况下打印“hello”,在另一种情况下打印“Usage”?
  • 感谢 Polar,您说得对。现在新问题层出不穷。我必须努力解决你在下一阶段指出的这个问题。
  • 如果您有一个包含要在外部使用的子例程的.pl 文件,听起来您有一个 Perl 4 风格的“perl 库”。您应该通过将其设置为 module 来将其更新到现代。然后,您可以通过完整的包名加载模块并运行其子例程,或者将模块中的子例程导入您的命名空间。最后,您可以创建一个也使用相同模块的脚本,并执行特定于脚本的逻辑,如 exit()。

标签: perl test-more


【解决方案1】:

要运行您希望退出的独立脚本,请使用system 运行它。捕获输出并在system 调用结束时对其进行检查。

use Test::More;
my $c = system("$^X some.pl arg1 arg2 > file1 2> file2");
ok($c == 0, 'program exited with successful exit code');
open my $fh, "<", "file1";
my $data1 = do { local $/; <$fh> };
close $fh;
open $fh, "<", "file2";
my $data2 = do { local $/; <$fh> };
close $fh;
ok( $data1 =~ /Funct1 output/, "program called Funct1");
ok( $data2 !~ /This is how you use the program, you moron/,
    "usage message not printed to STDERR" );
unlink("file1","file2");

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2018-02-03
    • 2020-01-24
    • 2015-11-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多