在Perl中对对象进行单元测试。检查它是否包含特定的哈希值
我已经从一个错误散列创建了一个错误对象,我正在尝试创建单元测试来检查对象是否包含所有正确的键 下午六点在Perl中对对象进行单元测试。检查它是否包含特定的哈希值,perl,unit-testing,object,hash,hash-of-hashes,Perl,Unit Testing,Object,Hash,Hash Of Hashes,我已经从一个错误散列创建了一个错误对象,我正在尝试创建单元测试来检查对象是否包含所有正确的键 下午六点 use constant { CABLING_ERROR => { errorCode => 561, message => "cabling is not correct at T1", tt => { template => 'disabled'}, fatal => 1, link =>'http
use constant {
CABLING_ERROR => {
errorCode => 561,
message => "cabling is not correct at T1",
tt => { template => 'disabled'},
fatal => 1,
link =>'http://www.e-solution.com/CABLING_ERROR',
},
};
Error.pm-新的子例程。(将错误哈希作为arg并创建新的错误对象)
我不确定我应该测试什么作为我的预期输出。哈希中的特定消息键或错误对象本身。我一直在尝试测试error对象中是否包含哈希的某个键,但我认为我的方法不对。不管怎样,这就是我一直在胡闹的事情:
错误测试
my $error = CABLING_ERROR;
#is(ref $error, 'HASH', 'error is a hashref');
my $error_in = ASC::Builder::Error->new($error);
my $exp_out_A = ($error->{message}); # is this the right expected output????
is(ref $error_in eq ASC::Builder::Error, 'It is an Error object'); #seen something like this online
#is(defined $error->{errorCode}, 1, "Error object contains key errorCode"); #these only test that the error hash contains these keys
#is(defined $error->{message}, 1, "Error object contains key message");
is($error_in, $exp_out_A, 'Correct message output');
测试文件有点乱,只是因为我一直在尝试各种尝试。我希望所有代码都没有语法错误:)。任何帮助都将不胜感激
这些是Error.pm文件中包含的我希望能够访问的其他方法,即我从散列中访问错误消息的方式。我不确定他们是否正确,但我认为他们非常接近
sub tt {
my $self = shift;
return $self->{tt} || {$_[0]->{tt} };
}
sub code {
my $self = shift;
return $self->{code} || {$_[0]->{code} };
}
sub wiki_page {
my $self = shift;
return $self->{wiki_page} || {$_[0]->{wiki_page} };
}
返回中的or条件是假设,因此可以通过id处理错误,它只是一个字符串或错误哈希。。我也不确定这是否正确
例如,当我在tt方法上运行单元测试时,我得到的是返回的哈希值,而不是tt值,tt值是“禁用的”
下面是我在上面运行的单元测试:
my $error = CABLING_ERROR;
my $error_in = ASC::Builder::Error->new($error);
isa_ok($error_in, 'ASC::Builder::Error');
can_ok( $error_in, 'tt');
is($error_in->tt(), ( $error || $error->{tt} ), 'Returns correct template');
您的第一个测试是正确的:
new
应该返回一个有效的对象。但是您应该使用,而不是检查ref
的返回,因为isa_ok
也将用于继承
更改:
my $error_in = ASC::Builder::Error->new($error);
is(ref $error_in eq ASC::Builder::Error, 'It is an Error object');
致:
还有,这是一个快捷方式:
my $abe = new_ok( ASC::Builder::Error => [ $error ] );
你的第二次考试有点不及格
$error\u in
是一个对象,而$exp\u out\u A
是一个字符串;比较它们是没有意义的
您应该编写一个从对象获取错误消息字符串的方法:
# In package ASC::Builder::Error
sub message {
return $_[0]->{message};
}
现在,您应该测试对象是否可以调用message()
方法。您可以通过以下方式执行此操作:
最后,您应该测试message()
方法是否返回初始化对象时使用的相同消息:
is( $abe->message(), $error->{message}, 'message() returns correct message' );
您的第一个测试是正确的:
new
应该返回一个有效的对象。但是您应该使用,而不是检查ref
的返回,因为isa_ok
也将用于继承
更改:
my $error_in = ASC::Builder::Error->new($error);
is(ref $error_in eq ASC::Builder::Error, 'It is an Error object');
致:
还有,这是一个快捷方式:
my $abe = new_ok( ASC::Builder::Error => [ $error ] );
你的第二次考试有点不及格
$error\u in
是一个对象,而$exp\u out\u A
是一个字符串;比较它们是没有意义的
您应该编写一个从对象获取错误消息字符串的方法:
# In package ASC::Builder::Error
sub message {
return $_[0]->{message};
}
现在,您应该测试对象是否可以调用message()
方法。您可以通过以下方式执行此操作:
最后,您应该测试message()
方法是否返回初始化对象时使用的相同消息:
is( $abe->message(), $error->{message}, 'message() returns correct message' );
.这种方法有效。但是请您解释一下消息子例程中发生了什么。is是否只是从作为参数传入的任何内容返回消息键?谢谢。子程序参数存储在
@
数组中,$[0]
是@
的第一个元素。调用方法时,类名或对象将自动作为第一个参数传递。例如,当您调用$foo->bar('baz')代码>,@
包含$foo
和'baz'
。因此,$\u0]->{message}
返回与对象中的消息
键对应的值。写my$self=shift会更清楚;返回$self->{message}代码>我试图测试散列的其他值,如code、tt和wiki_页面,但测试返回散列引用,而不是每个键的实际值。我应该如何编辑每种方法以识别其价值?我不太明白你在问什么。你真的为这些属性中的每一个编写了方法吗?是的,我很抱歉,但我会在我的问题中包括其中的一些。我没有意识到他们没有被包括在内。这个方法有效。但是请您解释一下消息子例程中发生了什么。is是否只是从作为参数传入的任何内容返回消息键?谢谢。子程序参数存储在@
数组中,$[0]
是@
的第一个元素。调用方法时,类名或对象将自动作为第一个参数传递。例如,当您调用$foo->bar('baz')代码>,@
包含$foo
和'baz'
。因此,$\u0]->{message}
返回与对象中的消息
键对应的值。写my$self=shift会更清楚;返回$self->{message}代码>我试图测试散列的其他值,如code、tt和wiki_页面,但测试返回散列引用,而不是每个键的实际值。我应该如何编辑每种方法以识别其价值?我不太明白你在问什么。你真的为这些属性中的每一个编写了方法吗?是的,我很抱歉,但我会在我的问题中包括其中的一些。我不知道他们不包括在内。