Executando o seguinte código:
#!/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;
resulta nesta saída:
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.
Não sei como me livrar dos avisos de incompatibilidade de protótipo. Tentei várias coisas sem efeito (algumas delas por desespero, não porque pensei que funcionariam):
- adicionando um protótipo ao sub anon
gettimeofday => sub () { return 1; },
- definiu um sub nomeado com um protótipo em um
BEGIN
bloco e o usou em seu lugar
BEGIN {
sub gtod () { return 1; }
}
my($mock) = Test2::Mock->new(
class => 'Time::HiRes',
override => [
gettimeofday => \>od,
]
);
- usando
Time::Hires
antesTest2::Mock
- importado
gettimeofday
emain
substituído, em combinação com todos os itens acima, por exemplo:
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;
- embrulhei em um
no warnings 'prototype'
bloco
{
no warnings 'prototype';
my($mock) = Test2::Mock->new(
class => 'main',
override => [
gettimeofday => sub () { return 1; },
]
);
}
Nada fez diferença.
Meu código funciona, mas há um aviso por um motivo, e eu realmente gostaria de lidar com isso da maneira adequada. O melhor que encontrei para encontrar uma resposta no Google foi suprimir a mensagem modificando $SIG{__WARN__}
, o que parece uma má ideia, se houver outras opções.
Nota: estou ciente de Test::Mock::Time
, Test::MockTime
, e Test::MockTime::HiRes
- eles não fazem o que eu preciso que eles façam, então pensei em fazer o meu próprio. Além disso, eu olhei, Sub::Prototype
mas ainda não tentei, pois não é um módulo principal e prefiro não ir lá, a menos que não haja outra escolha (nesse ponto, posso modificar $SIG{__WARN__}
.
Quando o
signatures
recurso está habilitado,()
não é um protótipo, mas uma assinatura.Você está habilitando esse recurso usando
use 5.038;
.A solução é usar
Alternativamente, você pode usar a sintaxe clássica do protótipo (
sub() { return 1; }
) em uma seção de código onde osignatures
recurso está desabilitado (por exemplo, usandono feature qw( signatures );
).