首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Perl测试对象的单元。检查它是否包含特定的散列值。

用Perl测试对象的单元。检查它是否包含特定的散列值。
EN

Stack Overflow用户
提问于 2016-03-30 14:57:12
回答 1查看 486关注 0票数 0

我已经从错误哈希创建了一个错误对象,并且我正在尝试创建单元测试,以检查对象包含所有正确的键。

ErrorLibrary.pm

代码语言:javascript
运行
复制
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 &创建一个新的错误对象)

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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文件中包含的其他方法,也就是我从哈希访问错误消息的方式。我不确定他们是否正确,但我认为他们相当接近。

代码语言:javascript
运行
复制
    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值。

下面是我在上面运行的单元测试:

代码语言:javascript
运行
复制
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');
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 18:25:50

您的第一个测试是正确的:new应该返回一个有效的对象。但是您应该使用isa_ok,而不是检查ref的返回,因为isa_ok也可以处理继承。

更改:

代码语言:javascript
运行
复制
my $error_in = ASC::Builder::Error->new($error);
is(ref $error_in eq ASC::Builder::Error, 'It is an Error object');

至:

代码语言:javascript
运行
复制
my $abe = ASC::Builder::Error->new($error); # less confusing variable name
isa_ok( $abe, 'ASC::Builder::Error' );

还有new_ok,这是一个快捷方式:

代码语言:javascript
运行
复制
my $abe = new_ok( ASC::Builder::Error => [ $error ] );

你的第二次考试有点差。$error_in是一个对象,但是$exp_out_A是一个字符串;比较它们是没有意义的。

您应该编写一个方法来从对象获取错误消息字符串:

代码语言:javascript
运行
复制
# In package ASC::Builder::Error
sub message {
    return $_[0]->{message};
}

现在,您应该测试您的对象是否可以调用message()方法。你可以用can_ok来做这件事

代码语言:javascript
运行
复制
can_ok( $abe, 'message' );

最后,您应该测试message()方法是否返回与您使用以下方法初始化对象时相同的消息:

代码语言:javascript
运行
复制
is( $abe->message(), $error->{message}, 'message() returns correct message' );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36312581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档