2016-03-30 10 views
0

Bir hata karmasından bir hata nesnesi oluşturdum ve nesneleri doğru anahtarları içerdiğini kontrol eden birim testleri oluşturmaya çalışıyorum.Perl'de bir nesneyi test eden birim. Belirli karma değerleri içerdiğini kontrol etme

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 - Yeni altprogram. Benim beklenen çıkışı olarak test edilmesi gerektiği konusunda emin değilim

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; 

} 
} 

(arg & yeni bir hata nesnesi oluşturur gibi hata karma Alır). Karma veya bir Hata nesnesinin kendisinde bulunan belirli mesaj anahtarı. Hata nesnesinde belirli bir anahtarın bulunup bulunmadığını test etmeye çalışıyorum, ama bunun doğru yoldan gittiğimi sanmıyorum. Neyse işte ben ile karıştırmasını oldum ne: test dosyası Çeşitli girişimler çalışıyorum, sırf biraz dağınık

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_test.t. Umarım tüm kod sözdizimi hataları içermez :). Herhangi bir yardım çok takdir edilecektir!

Bunlar, hata iletisine karma biçiminden erişme biçimim olan Access.pm dosyasında yer alan diğer yöntemlerdir. Doğru olup olmadıklarından emin değilim, ama bence oldukça yakınlar. varsayalım karşılığında

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} }; 
} 

veya koşul Ben de bu doğru olup olmadığından emin değilim .. bu yüzden hata ele alınabilir id onun sadece bir dize veya hata karma olduğunu.

Ünite testimi çalıştırdığımda, örneğin tt yöntemi, 'devre dışı' olan tt değeri yerine hash değerini döndürürüm. Eğer ilk testi ile doğru yolda olduğumuzu

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

cevap

2

: Burada

Bunun üzerine ran birim testidir new geçerli bir nesne döndürmesi gerekir. Ancak, 'un numarasını kullanmanız gerekir, çünkü isa_ok da devralma ile çalışacaktır.

Değişimi:

my $error_in = ASC::Builder::Error->new($error); 
is(ref $error_in eq ASC::Builder::Error, 'It is an Error object'); 

için:

my $abe = ASC::Builder::Error->new($error); # less confusing variable name 
isa_ok($abe, 'ASC::Builder::Error'); 

da new_ok yok, bir kısayol olan:

my $abe = new_ok(ASC::Builder::Error => [ $error ]); 

Sizin ikinci bir test biraz kapalıdır. $error_in bir nesnedir, ancak $exp_out_A bir dizedir; onları karşılaştırmak mantıklı değil.

# In package ASC::Builder::Error 
sub message { 
    return $_[0]->{message}; 
} 

Artık nesne message() yöntemini çağırabilirsiniz olarak test etmeniz gerekir:

Sen nesneden hata mesajı dize alma yöntemini yazmalı. Sen can_ok ile yapabilirsiniz:

is($abe->message(), $error->{message}, 'message() returns correct message'); 
+0

.Bu yöntem çalışır:

can_ok($abe, 'message'); 

Son olarak, message() yöntem ile nesne başlatıldı aynı mesajı verdiğini test etmelidir. Ama mesaj alt programında neler olduğunu açıklar mısınız? Sadece mesaj anahtarını argüman olarak kendisine aktarılandan döndürür mü? Teşekkürler. –

+1

Alt yordam argümanları '@ 'dizisinde saklanır ve' $ _ [0] ',' @' öğesinin ilk öğesidir. Bir yöntemi çağırdığınızda, sınıf adı veya nesnesi otomatik olarak ilk bağımsız değişken olarak iletilir. Örneğin, '$ foo-> bar (' baz '); ',' @' '$ foo' ve '' baz '' sözcüklerini çağırdığınızda. Yani '$ _ [0] -> {message}', nesne içindeki 'message' tuşuna karşılık gelen değeri döndürür. '$ $ Self = shift 'yazmak daha net olurdu; $ self öz geçmiş -> {message}; – ThisSuitIsBlackNot

+0

Kod, tt ve wiki_page gibi karma değerinin diğer değerlerini test etmeye çalışıyorum, ancak test, her bir anahtar için gerçek değerleri değil, karma referansları döndürür. Değeri tanımak için her biri için yöntemleri nasıl değiştirmeliyim? –

İlgili konular