Perl 模拟模块';有人不叫他吗?

Perl 模拟模块';有人不叫他吗?,perl,Perl,我有一个使用随机数的模块。出于测试目的,我想将随机数生成器设置为在调用之前提供给定的数字。我的测试代码包含如下依赖项: use Math::Random::MT qw(rand); 并这样使用它: my $currdice = int(rand($right) + 1); 我的嘲笑是这样做的: my $mockRand; BEGIN { $mockRand = Test::MockModule->new('Math::Random::MT'); use_ok(LogiD

我有一个使用随机数的模块。出于测试目的,我想将随机数生成器设置为在调用之前提供给定的数字。我的测试代码包含如下依赖项:

use Math::Random::MT qw(rand);
并这样使用它:

my $currdice = int(rand($right) + 1);
我的嘲笑是这样做的:

my $mockRand;
BEGIN {
    $mockRand = Test::MockModule->new('Math::Random::MT');
    use_ok(LogiDice);
}
$mockRand->mock('rand' => sub {return 1});
($successes, $output) = LogiDice::roll("3d10","ww");
ok($successes == 0, "WhiteWolf mode can return 0 successes") or diag ("Reported " . $successes . " successes instead.");

我得到的是随机数的成功,而不是总是0(因为随机数应该总是1,这应该总是失败)。这和我是怎么做的有关吗?我是否错误地使用了MockModule?我应该使用MockModule吗?在找到MockModule之前,我尝试了MockObject,但这也不起作用

所以,我认为发生的是

  • 你做你的模拟包装
  • 然后调用“use_ok(LogiDice)”,这会触发“Math::Random::MT qw(rand);”并立即将“rand”的副本拉入它自己的名称空间
  • 您的模拟调用将替换MT::rand(但不影响已经直接引用旧“rand”的MT::rand)

  • 如果您在调用mock“rand”后移动“use__ok”,则可能会起作用。或者,可以让LogiDice不将“rand”导入自己的名称空间,并始终引用MT::rand。

    查看调用
    rand
    的代码会有所帮助。大概在
    LogiDice
    ?@Borodin中,前两个引号来自LogiDice