Существует ли способ переопределить Perl, “используют постоянный” в Вашем поблочном тестировании?

Можно использовать inspect.stack()

import inspect,os
inspect.stack()[0]  => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0)
os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py'
5
задан Evan Carroll 18 November 2019 в 19:35
поделиться

4 ответа

При использовании констант они реализуются как функции констант. ведет себя примерно так:

use subs 'BASE_PATH';
sub BASE_PATH () {"/data/monitor/"}

Любое использование BASE_PATH в программе является встроенным и поэтому не может быть изменено.

Для достижения подобного вы можете вручную использовать прагму subs (чтобы заставить BASE_PATH вести себя как встроенную функцию) и объявить BASE_PATH как стандартная функция:

use subs 'BASE_PATH';
sub BASE_PATH {"/data/monitor/"}

print "BASE_PATH is ".BASE_PATH."\n";

*BASE_PATH = sub {"/new/path"};
print "BASE_PATH is ".BASE_PATH."\n";

Хотя я не совсем уверен, зачем вам это нужно.

6
ответ дан 18 December 2019 в 09:52
поделиться
package My::Class;

use constant BASE_PATH => "/a/real/value/";

# ..more code here..

1;

Теперь в ваших модульных тестах:

use My::Class;
*{My::Class::BASE_PATH} = sub { "/a/fake/value" };

# do your tests here...
2
ответ дан 18 December 2019 в 09:52
поделиться

Тесты часто выявляют негибкость дизайна. Это как-раз тот случай. Эта константа не должна быть постоянной.

Если вы делаете это из соображений производительности, я готов поспорить, что это не имеет никакого значения.

5
ответ дан 18 December 2019 в 09:52
поделиться

Очевидно, если ваше определение BASE_PATH было использовано / скомпилировано в другую подпрограмму ДО того, как ваш тест изменит его (через

*BASE_PATH = sub { ... }

или другой материал), у вас есть нет решения (потому что, когда исходный модуль использовал BASE_PATH как константу, он действительно определял функцию INLINE, которая была встроена при использовании в другом коде)

1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: