2016-11-13 17 views
10

Khi thử nghiệm :: So sánh nhiều hơn như arrayrefs và hashrefs với nhau, thông báo chẩn đoán tương ứng thực sự mang tính thông tin và hiển thị chỉ mục đầu tiên. , bất kể chiều sâu làm tổ. Tuy nhiên, khi so sánh mảng arrayref hoặc hashref với một vô hướng đơn giản, nó tạo ra một vô hướng được xâu chuỗi (với địa chỉ bộ nhớ và kiểu tham chiếu) trong thông báo chẩn đoán, khó giải thích hơn.Thử nghiệm :: Thêm is_deeply không in mảng/hashrefs khi so sánh với chuỗi

Có cách nào để định cấu hình Thử nghiệm :: Thêm vào mảng in đẹp hoặc hashref theo cách tùy chỉnh (chẳng hạn như sử dụng Dữ liệu :: Dumper) không?

Đây là ví dụ có hai trường hợp kiểm tra. Việc đầu tiên cung cấp cho bạn một số thông tin chi tiết về những gì có mặt trong chương trình của bạn nhưng không mong muốn. Thông báo thứ hai thông báo cho người dùng về loại không khớp giữa chuỗi và mảngref, nhưng không in bất kỳ mục nào trong mảngref.

#!/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)', 
); 

Và đầu ra TAP:

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. 

Nhìn vào thực hiện is_deeply trong Test :: hơn, có vẻ không phải là cách để sử dụng một tùy chỉnh khá-in hoặc cấu hình tính cách rườm rà của mô-đun. Ít nhất không ai rõ ràng với tôi.

Đây là những gì sẽ xảy ra khi chúng ta so sánh một tài liệu tham khảo và không tham khảo:

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

Nó dường như được gọi _format_stack({vals => [...]}) thay vì _format_stack(...)

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

Trả lời

9

tl; dr Sử dụng is_deeply($this, $that) || diag explain $this trên cơ sở từng trường hợp.

Xin chào. I'm the one to blame for is_deeply. Nó được thiết kế cố tình để không nôn ra một cấu trúc dữ liệu khổng lồ tiềm tàng khi có điều gì đó thất bại. Thay vào đó nó dừng lại ở sự khác biệt đầu tiên. Vì lý do này, có thể bạn không muốn làm cho các đối số của mình bị is_deeply kết xuất toàn cầu. Nếu các loại là sai, nếu bạn mong đợi táo và có ngựa vằn, không có nhiều điểm trong việc biết có bao nhiêu ngựa vằn và những câu chuyện cuộc sống của họ.

Không có cách nào được hỗ trợ để thay đổi chẩn đoán, xin lỗi và không chắc sẽ có. Kiểm tra :: Thêm đang được thay thế bằng Test2. Kiểm tra :: Thêm đã được thực hiện trên đầu trang của Test2, nhưng không tận dụng các tính năng của nó vì lý do tương thích ngược.

Bạn có thể sử dụng Test2::Bundle::More để truy cập trực tiếp hơn vào các tính năng của Test2, nhưng nó không tương thích 100% và hiển thị tương tự như cách is_deeply. Tuy nhiên, nó linh hoạt hơn nhiều và bạn có thể tìm ra cách để thay đổi hành vi chẩn đoán của nó. Nhìn vào Test2::Compare.


Quay lại vấn đề của bạn ... sử dụng explain trên cơ sở từng trường hợp. explain sử dụng Dữ liệu :: Dumper, được cấu hình đúng cách, để đổ cấu trúc dữ liệu. Kể từ khi thử nghiệm :: Nhiều chức năng hơn trả lại cho dù họ đã thông qua hoặc không thành công, bạn có thể viết is_deeply($this, $that) || diag explain $this. Ví dụ...

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 là cách bạn in chẩn đoán lỗi (đó là cách lịch sự hơn để in STDERR).

1

Hãy thử eq_or_diff($got, $expected, $message) từ Test::Differences, nó sẽ in đại diện đẹp cho cấu trúc dữ liệu của bạn và làm nổi bật rõ nét tương đồng và sự khác biệt chính xác.

+0

Nếu bạn muốn có sự khác biệt song song về cấu trúc dữ liệu, điều này thực sự tốt đẹp. Tuy nhiên, nếu bạn đang phát triển và cấu trúc dữ liệu đã thay đổi, bạn chỉ muốn thay thế định nghĩa trong mô-đun thử nghiệm, 'diag giải thích $ got' cung cấp đầu ra dễ dàng hơn để sao chép và dán. – Randall

Các vấn đề liên quan