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.
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |