Ваши тесты не пройдены, потому что is($x, $y, $name)
эквивалентно cmp_ok($x, 'eq', $y, $name)
. eq
заставляет каждый из его аргументов оцениваться как строки. Поскольку вам нужно числовое равенство, вы можете записать его с помощью cmp_ok
, используя '=='
. Вы могли бы упростить задачу, написав собственную числовую версию is
:
sub is_num {cmp_ok $_[0], '==', $_[1], $_[2]}
Но эта версия слегка нарушена, она будет сообщать об ошибках в неправильных строках. Чтобы в отчете об ошибках отображались правильные строки:
sub is_num {splice @_, 1, 0, '=='; goto &cmp_ok}
Причина goto &sub
заключается в том, что cmp_ok
использует caller
, чтобы определить, где произошла ошибка. Синтаксис goto &sub
стирает настройку кадра вызова для is_num
, так что cmp_ok
считает, что он вызывается из местоположения, в котором был is_num
.
Наконец, заглушка моего модуля Test :: Magic , которая обеспечивает синтаксический сахар для Test::More
:
use Test::Magic 'no_plan';
... # setup code
test 'fruit price',
is $price == 1.50;
Что интерпретируется как cmp_ok( $price, '==', 1.50, 'fruit price')