当Test :: More将arrayrefs和hashrefs相互比较时,相应的诊断消息确实提供了信息,并显示了结构不同的第一个索引,无论嵌套深度如何。但是,当它将arrayref或hashref与简单标量进行比较时,它会在诊断消息中生成一个字符串化的标量(带有内存地址和引用类型),这很难解释。
有没有办法以自定义方式(例如使用Data :: Dumper)将Test :: More配置为漂亮的打印数组或hashref?
这是一个包含两个测试用例的示例。第一部分让您深入了解程序中存在的内容,但却出乎意料。第二个通知用户字符串和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)',
);
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.
在Test :: More中查看is_deeply
的实现,似乎没有办法使用自定义漂亮的打印机或配置模块的详细程度。至少没有一个对我来说很明显。
以下是我们比较参考和非参考时会发生的情况:
https://metacpan.org/source/EXODIST/Test-Simple-1.302062/lib/Test/More.pm#L1121
似乎是在调用_format_stack({vals => [...]})
而不是_format_stack(...)
https://metacpan.org/source/EXODIST/Test-Simple-1.302062/lib/Test/More.pm#L1139
答案 0 :(得分:9)
tl; dr 根据具体情况使用is_deeply($this, $that) || diag explain $this
。
您好。 I'm the one to blame for is_deeply
。它故意设计为在出现故障时不会呕吐出潜在的巨大数据结构。相反,它停在第一个区别。出于这个原因,您可能不希望全局使is_deeply
转储其参数。如果这些类型是错误的,如果你期望苹果和斑马,那么知道有多少斑马和它们的生活故事就没什么意义了。
没有受支持的方法可以更改其诊断信息,抱歉,并且不太可能。 Test :: More正被Test2取代。 Test :: More已经在Test2之上实现,但由于向后兼容性的原因,它没有利用它的功能。
您可以使用Test2::Bundle::More更直接地访问Test2的功能,但它不是100%兼容,并且显示类似于is_deeply
的功能。但是,它更加灵活,您可以找到一种方法来改变其诊断行为。查看Test2::Compare。
回到你的问题......根据具体情况使用explain
。 explain
使用正确配置的Data :: Dumper来转储数据结构。由于Test :: More函数返回它们是通过还是失败,因此您可以编写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 :(得分:1)
从Test::Differences尝试eq_or_diff( $got, $expected, $message )
,它会打印出数据结构的精美表示,并清楚地突出显示相似点和不同点。