如何覆盖Perl的open()函数,但使用相同的文件句柄进行测试?

时间:2009-09-30 11:41:54

标签: perl unit-testing

我目前正在为一些遗留代码添加一些单元测试,我发现自己需要覆盖一个open函数。实时代码看起来像这样。

if ( !open( F, $filetoopen) ){
    # do stuff with <F>
}

我想要做的是确保“F”包含我从测试中提供的文件句柄,而不是它认为它打开的文件句柄。

我的.t文件中有以下代码......

BEGIN {
    *CORE::GLOBAL::open = sub { open(F,$testfiletoopen); };
};

...它确实有效,测试中的代码完成了从我的测试文件读取。但是,只要我使用与测试中的代码相同的文件句柄名称“F”,它就会继续工作。

如果有办法让这个测试代码不那么脆弱,那么如果在实时代码中更改了文件句柄名称,那么测试不会失败?

由于

1 个答案:

答案 0 :(得分:9)

为什么不简单地使用实时代码提供的参数来打开?

BEGIN {
    *CORE::GLOBAL::open = sub { open $_[0], $newfilename };
};

请记住,只要您使用open-three-argument-form形式,这将会非常糟糕。如果有的话,这个问题提供了更多证明三论证版本是优越的。