在 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' );