有没有办法在Perl中模拟内置的require函数?

Igo*_*yev 5 perl unit-testing mocking

我正在开发一个应用程序,必须逐个替换现有的意大利面条代码.为了实现这一点,我有一个调度程序,在匹配URI时运行所需的HTTP资源,否则使用旧的HTTP资源类.

因此,这个遗留的HTTP资源必须require是旧系统的入口点文件,我正在试图弄清楚如何测试这个过程.我现在看到它的方式是我想require用mock子例程替换原始函数,并检查它是否已使用适当的文件名调用.

这是可能的,如果没有,也许还有更好的方法吗?

Eri*_*rom 14

要覆盖require单个包:

use subs 'require';  # imports `require` so it can be overridden

sub require {print "mock require: @_\n"}
Run Code Online (Sandbox Code Playgroud)

require全局覆盖:

BEGIN {
    *CORE::GLOBAL::require = sub {print "mock require: @_\n"}
}
Run Code Online (Sandbox Code Playgroud)

然后:

require xyz;           # mock require: xyz.pm

require Some::Module;  # mock require: Some/Module.pm
Run Code Online (Sandbox Code Playgroud)


cjm*_*cjm 11

覆盖require全局的更好方法可能是安装钩子@INC.这个鲜为人知的官能度的端部描述require文档.

这是一个简单的示例,它拦截名称以HTTP开头的模块的任何请求:

BEGIN {
  unshift @INC, sub {
    my ($self, $file) = @_;
    return unless $file =~ /^HTTP/;
    print "Creating mock $file\n";
    my @code = "1"; # Fake module must return true
    return sub { $_ = shift @code; defined $_ };
  }
}

require HTTP::Foo;
use HTTPBar;
Run Code Online (Sandbox Code Playgroud)

请注意,这也是嘲笑use,因为它是基于require.