MockModule的模拟没被调用?

时间:2014-07-27 14:41:22

标签: 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(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,这应该总是失败)。这与我如何做qw(rand)有关吗?我错误地使用MockModule了吗?我应该使用MockModule吗?在我找到MockModule之前我尝试了MockObject,但那也没有用。

1 个答案:

答案 0 :(得分:2)

所以,我认为发生的是......

  1. 你制作模拟包装
  2. 然后你调用“use_ok(LogiDice)”,它会触发“Math :: Random :: MT qw(rand);”并立即将“rand”的副本拉入其自己的命名空间
  3. 你的模拟调用取代了MT :: rand(但不会影响哪些已经直接引用旧的“rand”)
  4. 如果你在调用模拟“rand”后移动“use_ok”,它可能会有效。或者,可以使LogiDice不将“rand”导入其自己的命名空间,并始终引用MT :: rand。