我已经从错误哈希创建了一个错误对象,并且我正在尝试创建单元测试,以检查对象包含所有正确的键。
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 -新子程序。(将错误哈希作为arg &创建一个新的错误对象)
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} };
}
返回中的或条件是假设的,因此错误可以被处理,如果它只是一个字符串或错误哈希。我也不确定这是否正确。
例如,当我在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');
发布于 2016-03-30 18:25:50
您的第一个测试是正确的:new
应该返回一个有效的对象。但是您应该使用isa_ok
,而不是检查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 = 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()
方法是否返回与您使用以下方法初始化对象时相同的消息:
is( $abe->message(), $error->{message}, 'message() returns correct message' );
https://stackoverflow.com/questions/36312581
复制相似问题