Могу ли я включить аргумент в ссылку на код при вызове Test :: Output :: stdout_like () - PullRequest
2 голосов
/ 30 марта 2012

Я пишу модульные тесты, используя Test :: More и Test :: Output. Я использую Test :: More для проверки возвращаемых значений и планирую использовать Test :: Output для проверки стандартного вывода, созданного моими подпрограммами.

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

Я предполагаю, что это обычная практика в скриптах модульного тестирования Perl. Кто-нибудь может предложить пример?

Примечание, спасибо Курту В. Лейхту за его введение в модульное тестирование Perl: Сборка Perl, модульное тестирование, покрытие кода: полный рабочий пример

1 Ответ

2 голосов
/ 30 марта 2012

Нет, вы не можете напрямую включить arg в coderef.

Чтобы передать arg в coderef, вам нужно вызвать его:

mysub( $arg );      # the usual way to call the sub
$coderef = \&mysub; # get the reference to the sub
$coderef->( $arg ); # call the coderef with an arg (or &$coderef($arg))

Но чтобы что-то работалос помощью Test::Output вы можете заключить вызовы в подпрограммы, которые вы хотите протестировать, в другую подпрограмму:

use Test::Output;
sub callmysubwitharg { mysub($arg) }
stdout_like \&callmysubwitharg, qr/$expecting/, 'description';

И это то же самое, используя анонимную подпрограмму :

stdout_like { mysub($arg) } qr/$expecting/, 'description';
...