Могу ли я использовать интеллектуальное сопоставление ~~ в cmp_ok Test :: More? - PullRequest
1 голос
/ 11 октября 2010

Я тестирую функцию, которая возвращает массив.Массив может отличаться в зависимости от среды, но у него всегда будет хотя бы одно постоянное значение (то, которое я хочу протестировать).

Поскольку я использую Perl 5.12, я могу использовать оператор smartmatch, чтобы найтиесли элемент находится в массиве:

ok($known_value ~~ @returned, 'testing method abc')

Но мне нравится расширенный вывод is и like с "найденными" и "ожидаемыми" частями.Итак, я попробовал это:

cmp_ok($known_value, '~~', @returned, 'testing method abc')

Это не работает, потому что кажется, что cmp_ok ожидает скаляр в обеих частях сравнения:

not ok 1 - testing method abc
#   Failed test 'testing method abc'
#   at abc.t line 53.
#     'stable_value'
#         ~~
#     '2'

Массив в "ожидаемослот вычисляется в скалярном контексте и преобразуется в 2.

Я могу обойти это с помощью хака, используя like и строкового массива, но имея тест, в котором вы можете использовать оператор smartmatch в качестве метода сравнения(вроде when) было бы неплохо.Есть ли способ сделать это с помощью Test :: More или другого модуля?

В настоящее время я использую:

ok($known_value ~~ @returned, 'testing method abc')
  or diag (
      "ERROR:\n".
      "Found: ". Dumper @returned."\n".
      "Expected at least one element equal to '$known_value'"
  )

Это лучшее, что я могу сделать?

Ответы [ 3 ]

9 голосов
/ 11 октября 2010

Вы не можете использовать @returned из-за того, как Perl передает аргументы подпрограммам.(Массивы сливаются в список аргументов и теряют свою идентичность.) Вместо этого передайте ссылку на массив:

cmp_ok($known_value, '~~', \@returned, 'testing method abc')

Оператор умного сопоставления достаточно умен, чтобы делать правильные вещи.От perlsyn:

Обратите внимание, что интеллектуальное сопоставление неявно разыменовывает любой неблаженный хэш или ссылку на массив, поэтому в этих случаях применяются записи "Hash" и "Array".

3 голосов
/ 11 октября 2010

Test::Deep предоставляет множество утилит для тестирования частей (возможно, очень глубоко вложенных) структур, а также производит довольно полезную диагностику в случае сбоев.Я полагаю, что одна из ее функций bag может выполнить эту работу за вас.

use Test::Deep;

my @foo = ('bar', 'baz', 'moo');

cmp_deeply(
    \@foo,
    superbagof('baz'),
    '@foo contains at least one "baz"',
);

Таким образом, если вам когда-нибудь понадобится, вы можете сделать гораздо более сложные утверждения, чем без умного сопоставления.необходимость разбивать вещи на гораздо более мелкие куски, а также будет продолжать работать на старых perls.

2 голосов
/ 11 октября 2010

Автоматический сброс с Test :: More , Test :: Most :

use Test::More 0.82; diag explain \@returned;

use Test::Most 0.21; show \@returned;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...