在 Perl 中对对象进行单元测试。检查它是否包含特定的哈希值
Unit testing an object in Perl. Checking that it contains specific hash values
我已经从错误散列创建了一个错误对象,并且正在尝试创建单元测试来检查对象是否包含所有正确的键。
ErrorLibrary.pm
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 - 新的子例程。 (将错误散列作为参数并创建一个新的错误对象)
package ASC::Builder:Error;
sub new {
my ($package, $first_param) = (shift, shift);
if (ref $first_param eq 'HASH') {
my %params = @_;
return bless { message => $first_param->{message}, %params}, $package;
}
else {
my %params = @_;
return bless {message => $first_param, %params}, $package;
}
}
我不确定我应该测试什么作为我的预期输出。哈希中的特定消息键或错误对象本身。我一直在尝试测试错误对象中是否包含哈希的某个键,但我认为我的做法不正确。无论如何,这就是我一直在搞乱的事情:
error_test.t
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} };
}
假设 return 中的 or 条件是错误可以处理,id 它只是一个字符串或错误散列。我也不确定这是否正确。
当我 运行 我的单元测试例如 tt 方法时,我得到哈希值 returned 而不是 tt 的值 'disabled'.
这里是单元测试我运行就可以了:
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
应该 return 一个有效的对象。但是你应该使用 isa_ok
而不是检查 ref
的 return 因为 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 = ASC::Builder::Error->new($error); # less confusing variable name
isa_ok( $abe, 'ASC::Builder::Error' );
还有new_ok
,这是一个快捷方式:
my $abe = new_ok( ASC::Builder::Error => [ $error ] );
你的第二次测试有点不对劲。 $error_in
是一个对象,而$exp_out_A
是一个字符串;比较它们没有意义。
您应该编写一个方法来从您的对象中获取错误消息字符串:
# In package ASC::Builder::Error
sub message {
return $_[0]->{message};
}
现在您应该测试您的对象是否可以调用 message()
方法。您可以使用 can_ok
:
can_ok( $abe, 'message' );
最后,您应该测试 message()
方法 return 是否与您初始化对象的消息相同:
is( $abe->message(), $error->{message}, 'message() returns correct message' );
我已经从错误散列创建了一个错误对象,并且正在尝试创建单元测试来检查对象是否包含所有正确的键。
ErrorLibrary.pm
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 - 新的子例程。 (将错误散列作为参数并创建一个新的错误对象)
package ASC::Builder:Error;
sub new {
my ($package, $first_param) = (shift, shift);
if (ref $first_param eq 'HASH') {
my %params = @_;
return bless { message => $first_param->{message}, %params}, $package;
}
else {
my %params = @_;
return bless {message => $first_param, %params}, $package;
}
}
我不确定我应该测试什么作为我的预期输出。哈希中的特定消息键或错误对象本身。我一直在尝试测试错误对象中是否包含哈希的某个键,但我认为我的做法不正确。无论如何,这就是我一直在搞乱的事情:
error_test.t
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} };
}
假设 return 中的 or 条件是错误可以处理,id 它只是一个字符串或错误散列。我也不确定这是否正确。
当我 运行 我的单元测试例如 tt 方法时,我得到哈希值 returned 而不是 tt 的值 'disabled'.
这里是单元测试我运行就可以了:
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
应该 return 一个有效的对象。但是你应该使用 isa_ok
而不是检查 ref
的 return 因为 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 = ASC::Builder::Error->new($error); # less confusing variable name
isa_ok( $abe, 'ASC::Builder::Error' );
还有new_ok
,这是一个快捷方式:
my $abe = new_ok( ASC::Builder::Error => [ $error ] );
你的第二次测试有点不对劲。 $error_in
是一个对象,而$exp_out_A
是一个字符串;比较它们没有意义。
您应该编写一个方法来从您的对象中获取错误消息字符串:
# In package ASC::Builder::Error
sub message {
return $_[0]->{message};
}
现在您应该测试您的对象是否可以调用 message()
方法。您可以使用 can_ok
:
can_ok( $abe, 'message' );
最后,您应该测试 message()
方法 return 是否与您初始化对象的消息相同:
is( $abe->message(), $error->{message}, 'message() returns correct message' );