2016-11-13 8 views
10

के खिलाफ तुलना करते समय अधिक is_deeply सुंदर-प्रिंट सरणी/हैशफ्रे नहीं करता है जब परीक्षण :: एक दूसरे के साथ arrayrefs और हैशफ्रिक्स की तुलना में अधिक तुलना करता है, इसी तरह का निदान संदेश वास्तव में जानकारीपूर्ण होता है और पहली अनुक्रमणिका दिखाता है जहां संरचनाएं भिन्न होती हैं घोंसले की गहराई के बावजूद। हालांकि, जब यह एक सरणी या हैशफ की तुलना एक साधारण स्केलर से कर रहा है, तो यह डायग्नोस्टिक संदेश में एक स्ट्रिंगफाइड स्केलर (स्मृति पता और संदर्भ प्रकार के साथ) उत्पन्न करता है, जो व्याख्या करना कठिन होता है।टेस्ट :: स्ट्रिंग

क्या टेस्ट :: कॉन्फ़िगर करने का कोई तरीका है कस्टम प्रिंट में सरणी या हैशफ्स को कस्टम तरीके से (जैसे डेटा :: डम्पर का उपयोग करना)?

यहां दो परीक्षण मामलों के साथ एक उदाहरण दिया गया है। सबसे पहले आपको अपने कार्यक्रम में मौजूद कुछ अंतर्दृष्टि प्रदान करता है लेकिन अप्रत्याशित। दूसरा स्ट्रिंग और arrayref के बीच एक प्रकार के मिलान के उपयोगकर्ता को सूचित करता है, लेकिन arrayref में किसी भी आइटम को मुद्रित नहीं करता है।

#!/usr/bin/env perl 
use strict; 
use warnings; 
use Test::More tests => 2; 

is_deeply(
    { 
     a => [5], 
    }, 
    { 
     a => [5, 6, 8], 
    }, 
    'compare two hashrefs structurally (very informative output)', 
); 

is_deeply(
    [5, 6, 8], 
    "", 
    'compare two "incompatible" values structurally (uninformative output)', 
); 

और नल उत्पादन:

1..2 
not ok 1 - compare two hashrefs structurally (very informative output) 
# Failed test 'compare two hashrefs structurally (very informative output)' 
# at test-more-failure.pl line 6. 
#  Structures begin differing at: 
#   $got->{a}[1] = Does not exist 
#  $expected->{a}[1] = '6' 
not ok 2 - compare two "incompatible" values structurally (uninformative output) 
# Failed test 'compare two "incompatible" values structurally (uninformative output)' 
# at test-more-failure.pl line 16. 
#  Structures begin differing at: 
#   $got = ARRAY(0x7fe66b82cde8) 
#  $expected = '' 
# Looks like you failed 2 tests of 2. 

टेस्ट में is_deeply के कार्यान्वयन को देखते हुए :: अधिक है, वहाँ एक कस्टम सुंदर-प्रिंटर का उपयोग या शब्दाडंबर कॉन्फ़िगर करने के लिए तरीका हो प्रतीत नहीं होता है मॉड्यूल के। कम से कम कोई भी मेरे लिए स्पष्ट नहीं है।

यहाँ क्या होता है जब हम एक संदर्भ और गैर संदर्भ तुलना है:

https://metacpan.org/source/EXODIST/Test-Simple-1.302062/lib/Test/More.pm#L1121

यह _format_stack(...)

https://metacpan.org/source/EXODIST/Test-Simple-1.302062/lib/Test/More.pm#L1139

उत्तर

9

tl के बजाय _format_stack({vals => [...]}) बुला किया जा रहा है, डॉ मामले के आधार पर is_deeply($this, $that) || diag explain $this का उपयोग करें।

हाय। I'm the one to blame for is_deeply। यह जानबूझकर डिज़ाइन किया गया है कि कुछ विफल होने पर संभावित रूप से विशाल डेटा संरचना को उल्टा न करें। इसके बजाय यह पहले अंतर पर रुक जाता है। इस कारण से आप संभवतः is_deeply अपने तर्कों को डंप करने के लिए वैश्विक स्तर पर नहीं बनाना चाहते हैं। यदि प्रकार गलत हैं, यदि आप सेब की उम्मीद करते हैं और ज़ेबरा प्राप्त करते हैं, तो यह जानने में बहुत कुछ नहीं है कि कितने ज़ेबरा और उनके जीवन की कहानियां हैं।

इसके निदान को बदलने के लिए कोई समर्थित तरीका नहीं है, क्षमा करें, और यह संभावना नहीं है। टेस्ट :: अधिक Test2 द्वारा प्रतिस्थापित किया जा रहा है। टेस्ट :: अधिक पहले से ही टेस्ट 2 के शीर्ष पर लागू किया गया है, लेकिन पीछे की संगतता कारणों के लिए इसकी विशेषताओं का लाभ नहीं उठाता है।

आप टेस्ट 2 की विशेषताओं तक अधिक सीधी पहुंच के लिए Test2::Bundle::More का उपयोग कर सकते हैं, लेकिन यह 100% संगत नहीं है, और यह is_deeply करता है के समान प्रदर्शित करता है। हालांकि, यह अधिक लचीला है और आप शायद इसके नैदानिक ​​व्यवहार को बदलने का एक तरीका समझ सकते हैं। Test2::Compare में देखें।


आपकी समस्या पर वापस जाएं ... मामले के आधार पर explain का उपयोग करें। explain डेटा संरचना को डंप करने के लिए डेटा :: डम्पर का उपयोग करता है, ठीक से कॉन्फ़िगर किया गया है। चूंकि टेस्ट :: अधिक फ़ंक्शंस वापस लौटाता है या नहीं, तो आप is_deeply($this, $that) || diag explain $this लिख सकते हैं। उदाहरण के लिए...

my $stuff = [5, 6, 8]; 
is_deeply $stuff, "" || diag explain $stuff; 

not ok 2 
# Failed test at /Users/schwern/tmp/test.plx line 17. 
#  Structures begin differing at: 
#   $got = ARRAY(0x7f80b3803078) 
#  $expected = '' 
# [ 
# 5, 
# 6, 
# 8 
# ] 

diag कैसे आप विफलता निदान प्रिंट (यह STDERR को मुद्रित करने के लिए एक अधिक विनम्र तरीका है) है।

1

Test::Differences से eq_or_diff($got, $expected, $message) आज़माएं, यह आपके डेटा संरचनाओं का एक सुंदर प्रतिनिधित्व प्रिंट करेगा और सटीक समानताओं और मतभेदों को स्पष्ट रूप से हाइलाइट करेगा।

+0

यदि आप डेटा संरचनाओं के साइड-बाय-साइड डिफ को चाहते हैं, तो यह वास्तव में अच्छा है। यदि आप विकास में हैं, हालांकि, और डेटा संरचना बदल गई है, तो आप केवल परीक्षण मॉड्यूल में परिभाषा को प्रतिस्थापित करना चाहते हैं, 'डायग समझाएं $ मिल गया' कॉपी और पेस्ट करने के लिए एक आसान आउटपुट प्रदान करता है। – Randall

संबंधित मुद्दे