如何在perl中测试ref条件?
G'Day 我尝试对使用如下语句的函数进行单元测试:如何在perl中测试ref条件?,perl,unit-testing,ref,Perl,Unit Testing,Ref,G'Day 我尝试对使用如下语句的函数进行单元测试: unless($this->_doc_type eq ref($this->_doc_instance)) { # Do something } 无论我如何嘲笑我的对象,你似乎都无法愚弄ref()。我应该如何进行测试 是否有一个私有的ref()函数来调用CORE::ref() 在我的单元测试中尝试并覆盖CORE::ref 在糟糕的过去,我们有表单代码 switch (item->type) { case
unless($this->_doc_type eq ref($this->_doc_instance)) {
# Do something
}
无论我如何嘲笑我的对象,你似乎都无法愚弄ref()。我应该如何进行测试
- 是否有一个私有的
函数来调用ref()
李>CORE::ref()
- 在我的单元测试中尝试并覆盖
李>CORE::ref
- 在糟糕的过去,我们有表单代码
switch (item->type) {
case FOO:
do_foo(item);
break;
case BAR:
do_bar(item);
break;
default:
handle_unknown_type(item->type, __FILE__, __LINE__);
break;
}
这种显式检查项目类型然后分支到不同函数的模式在系统源代码中重复了很多次
当需要在组合中添加一个新类型BAZ
时,这意味着返回并触摸每一个开关
,如果
/其他
链,或涉及项目->类型
的任何其他条件
这是一个巨大的痛苦
面向对象语言吸收了这种模式,因此程序员不必到处重新实现它,也不必在这种低级的管道上浪费精神资源。当据称面向对象的代码怀念过去糟糕的日子时,如
unless ($this->_doc_type eq ref($this->_doc_instance)) { ... }
这是一种强烈的代码气味
我的第一个建议是重新设计生产代码。条件内存中发生了什么?该代码的目的是什么
我假设您一直在为\u doc\u实例
使用mock。为了在重构代码之前获得适当的测试支持,我将研究如何更改从\u doc\u type
返回的值,我还假设它不是一个简单的getter。在不知道任何关于上下文的其他信息的情况下,一种方法是创建一个测试子类
假设您正在测试的类是My::Container
。如果您可以在这个特定的测试中使用一个假的文档(一个只有真实文档表面外观的文档),那么请按照
package Test::My::Container_Canned_Type;
use base 'My::Container';
sub _doc_type { "Test::Fake::Document" }
1;
然后在你的测试中,像在
my $doc = bless {} => "Test::Fake::Document";
my $c = Test::My::Container_Canned_Type->new($doc, ...);
如果我对你的代码结构猜错了,请提供更多的上下文,这样我们可以给你更多有用的建议
发现自己处于这一困境是一个很好的教训,为什么先写测试是有帮助的。通过设计,您可以消除那些挠头、想知道如何测试奇怪实现的情况
总结
- 不,不要试图修改
的工作方式ref
- 尽可能避免在生产代码中使用
ref
Ford
doc应该输入除非条件,即使doctype是Car
和Ford
isaCar
,如果有意义的话:谢谢你非常周到的回答。事实证明,doctype
是一个简单的访问器:)@Gaurav-Hm,我很难想象您的实现。如果您编辑您的问题以提供您正在测试的类的高级意图草图,以及\u doc\u实例
和\u doc\u类型
之间的关系,我们将能够为您提供具体的、有用的建议。