有没有办法在单元测试中覆盖Perl"使用常量"?

Vag*_*err 5 perl unit-testing constants mocking compile-time-constant

我有一个Perl模块,我已经声明了一些常量:

use constant BASE_PATH => "/data/monitor/";
Run Code Online (Sandbox Code Playgroud)

在实时操作中,常量永远不会改变,但我希望能够在单元测试中修改它,例如将其设置为〜/ project/testdata /.有没有办法做到这一点,而不必使用"非常数"?

我可以在constant.pm上使用Test :: MockObject吗?

Cal*_*lum 6

当使用常量时,它们被实现为常量函数,其行为类似于:

use subs 'BASE_PATH';
sub BASE_PATH () {"/data/monitor/"}
Run Code Online (Sandbox Code Playgroud)

程序中BASE_PATH的任何使用都是内联的,因此无法修改.

要实现类似,您可以手动使用subs pragma(使BASE_PATH表现为内置函数)并将BASE_PATH声明为标准函数:

use subs 'BASE_PATH';
sub BASE_PATH {"/data/monitor/"}

print "BASE_PATH is ".BASE_PATH."\n";

*BASE_PATH = sub {"/new/path"};
print "BASE_PATH is ".BASE_PATH."\n";
Run Code Online (Sandbox Code Playgroud)

虽然你为什么要这样做我不太确定.


Sch*_*ern 5

测试通常表明设计缺乏灵活性.这是其中一次.那个常数不应该是恒定的.

如果你出于性能原因这样做,我愿意用坚硬的货币押注它没有任何区别.