Test2::Mock 的“原型不匹配”警告

问题描述 投票:0回答:1

运行以下代码:

#!/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 => \&gtod,
    ]
);
  • 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__}
相反。

unit-testing perl warnings
1个回答
0
投票

使用

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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.