运行以下代码:
#!/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.
我不知道如何摆脱原型不匹配警告。我尝试了很多没有效果的方法(其中一些是出于绝望,而不是因为我认为它们会起作用):
- 添加原型到 anon sub
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__}
。
当该
signatures
功能启用时,()
它不是原型而是签名。您正在使用启用此功能
use 5.038;
。修复方法是使用
或者,您可以在禁用
sub() { return 1; }
该功能的代码部分中使用经典原型语法 ( )(例如使用)。signatures
no feature qw( signatures );