运行以下代码:
#!/usr/bin/env perl
use 5.038;
use Test2::Mock;
use Time::HiRes;
my($mock) = Test2::Mock->new(
class => 'Time::HiRes',
override => [
gettimeofday => sub { return 1; },
]
);
my($foo) = Time::HiRes::gettimeofday;
say $foo;
输出结果:
Prototype mismatch: sub Time::HiRes::gettimeofday () vs none at /opt/perl/lib/site_perl/5.38.0/Test2/Mock.pm line 434.
1
Prototype mismatch: sub Time::HiRes::gettimeofday: none vs () at /opt/perl/lib/site_perl/5.38.0/Test2/Mock.pm line 452.
我不知道如何摆脱原型不匹配警告。我尝试了很多方法但没有效果(其中一些是出于绝望,而不是因为我认为它们会起作用):
gettimeofday => sub () { return 1; },
BEGIN
块中定义了一个带有原型的命名子并使用它来代替BEGIN {
sub gtod () { return 1; }
}
my($mock) = Test2::Mock->new(
class => 'Time::HiRes',
override => [
gettimeofday => \>od,
]
);
Time::Hires
之前使用
Test2::Mock
gettimeofday
导入到 main
中,并与上述所有内容结合起来覆盖它,例如:use Test2::Mock;
use Time::HiRes qw(gettimeofday);
my($mock) = Test2::Mock->new(
class => 'main',
override => [
gettimeofday => sub () { return 1; },
]
);
my($foo) = gettimeofday;
say $foo;
no warnings 'prototype'
块中{
no warnings 'prototype';
my($mock) = Test2::Mock->new(
class => 'main',
override => [
gettimeofday => sub () { return 1; },
]
);
}
没有任何区别。
我的代码可以工作,但有一个警告是有原因的,我真的很想以正确的方式处理它。我通过谷歌搜索找到的最好答案是通过修改
$SIG{__WARN__}
来抑制消息,如果还有其他选择的话,这似乎是一个坏主意。
Test::Mock::Time
、Test::MockTime
和 Test::MockTime::HiRes
——他们没有做我需要他们做的事情,所以我想我应该自己做。另外,我看过 Sub::Prototype
但还没有尝试过,因为它不是核心模块,我宁愿不去那里,除非没有其他选择(此时我可能会修改 $SIG{__WARN__}
相反。
使用
use feature qw( signatures );
时(就像通过 use 5.038;
一样),()
不是原型,而是签名。除了使用
sub() { return 1; }
添加
no feature qw( signatures );
您可以将其添加到
use 5.038;
之后,也可以限制其范围。
do {
no feature qw( signatures );
sub() { return 1; }
}