Class::Accessor + Test::Deep = fail

| 1 комментарий

Для этого фокуса потребуется взять один Class::Accessor и один Test::Deep, замешав их в одном модуле:

package MyTest;

use base 'Class::Accessor';
use Test::Deep;

__PACKAGE__->mk_accessors qw(mytest);

1;

Модуль Class::Accessor создаст в пакете MyTest метод mytest(), который должен работать как пара сеттер — геттер для установки поля mytest (точнее, $self->{mytest}). Тестируем:

use v5.12;
use MyTest;

my $test = new MyTest;
$test->mytest('test');
say "mytest=", $test->mytest;

И видим, что никакое значение mytest=test не устанавливается. Комментируем в файле MyTest.pm строку, подключающую модуль Test::Deep, и все работает:

mytest=test

Раскомментируем обратно и попробуем немного по-другому:

$test->set('key', 'value');
set $test('key', 'value');

Опять не работает. Но по-другому мы пробуем уже после того, как заглянули в исходник Test::Deep и увидели там безусловный экспорт функции set:

@EXPORT = qw( eq_deeply cmp_deeply cmp_set cmp_bag cmp_methods
    useclass noclass set bag subbagof superbagof subsetof
    supersetof superhashof subhashof
);

В свою очередь, внутри методов-аккессоров, которые создает Class::Accessor, используются вызовы $self->set(...), которые в модуле, унаследованном от него, попадают напрямую в Test::Deep::set().

Неуклюжее быстрое решение: подсказать компилятору, куда направлять внутренние вызовы методов set:

package MyTest;

use base 'Class::Accessor';
use Test::Deep;

*set = *Class::Accessor::set;

__PACKAGE__->mk_accessors qw(mytest);

1;

1 комментарий

По идее можно делать так: "use Test::Deep qw/!set/".

Я натыкался на эту проблему, правда с другим методом -- Test::Deep экспортирует isa :)

В RT у Test::Deep примерно каждый второй баг про лишние экспорты.

Комментировать

Страницы

  • img

Об этой записи

Сообщение опубликовано 30.06.2010 23:43. Автор — ash.

Предыдущая запись — RPC::XML v. XXX

Следующая запись — Из свежих обсуждений

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.