在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_页面,但测试返回散列引用,而不是每个键的实际值。我应该如何编辑每种方法以识别其价值?我不太明白你在问什么。你真的为这些属性中的每一个编写了方法吗?是的,我很抱歉,但我会在我的问题中包括其中的一些。我不知道他们不包括在内。