内容

名称

TAP::Parser::SourceHandler::Perl - 从 Perl 可执行文件流式传输 TAP

版本

版本 3.44

概要

use TAP::Parser::Source;
use TAP::Parser::SourceHandler::Perl;

my $source = TAP::Parser::Source->new->raw( \'script.pl' );
$source->assemble_meta;

my $class = 'TAP::Parser::SourceHandler::Perl';
my $vote  = $class->can_handle( $source );
my $iter  = $class->make_iterator( $source );

说明

这是一个Perl TAP::Parser::SourceHandler - 它有 2 项工作

1. 确定给定的 TAP::Parser::Source 实际上是否是一个 Perl 脚本 ("can_handle").

2. 为 Perl 源代码创建一个迭代器 ("make_iterator").

除非您正在编写插件或对 TAP::Parser 进行子类化,否则您可能不需要直接使用此模块。

方法

类方法

can_handle

my $vote = $class->can_handle( $source );

仅在 $source 看起来像文件时才投票。投出以下选票

0.9  if it has a shebang ala "#!...perl"
0.3  if it has any shebang
0.8  if it's a .t file
0.9  if it's a .pl file
0.75 if it's in a 't' directory
0.25 by default (backwards compat)

make_iterator

my $iterator = $class->make_iterator( $source );

为源代码构建并返回一个新的 TAP::Parser::Iterator::Process。假设 $source->raw 包含对 perl 脚本的引用。如果找不到文件,则会发出 croak

运行命令的构建如下

$perl @switches $perl_script @test_args

要使用的 perl 命令由 "get_perl" 确定。生成的命令保证保留

PERL5LIB
PERL5OPT
Taint Mode, if set in the script's shebang

注意:生成的命令不会遵守 Perl 脚本中定义的任何 shebang 行。只有在您编译了 Perl 的自定义版本,或者您希望对一个测试使用特定版本的 Perl,而对另一个测试使用不同版本时,这才是问题,例如

#!/path/to/a/custom_perl --some --args
#!/usr/local/perl-5.6/bin/perl -w

目前您需要编写一个插件来解决这个问题。

get_taint

从 Perl shebang 行解码任何 taint 开关。

# $taint will be 't'
my $taint = TAP::Parser::SourceHandler::Perl->get_taint( '#!/usr/bin/perl -t' );

# $untaint will be undefined
my $untaint = TAP::Parser::SourceHandler::Perl->get_taint( '#!/usr/bin/perl' );

get_perl

获取当前运行测试套件的 Perl 版本。

子类化

有关子类化的概述,请参见 TAP::Parser 中的“SUBCLASSING”

示例

  package MyPerlSourceHandler;

  use strict;

  use TAP::Parser::SourceHandler::Perl;

  use base 'TAP::Parser::SourceHandler::Perl';

  # use the version of perl from the shebang line in the test file
  sub get_perl {
      my $self = shift;
      if (my $shebang = $self->shebang( $self->{file} )) {
          $shebang =~ /^#!(.*\bperl.*?)(?:(?:\s)|(?:$))/;
	  return $1 if $1;
      }
      return $self->SUPER::get_perl(@_);
  }

另请参见

TAP::ObjectTAP::ParserTAP::Parser::IteratorFactoryTAP::Parser::SourceHandlerTAP::Parser::SourceHandler::ExecutableTAP::Parser::SourceHandler::FileTAP::Parser::SourceHandler::HandleTAP::Parser::SourceHandler::RawTAP