Тестирование с помощью `use-ok` на модулях с определением` MAIN`

Я пишу новый проект Perl 6 для работы и хотел бы иметь возможность проверить, все ли части могут быть used правильно. Для этого я использую подпрограмму use-ok из модуля Test. Я пытаюсь легко протестировать все файлы модуля, используя следующий код:

"META6.json".IO.slurp.&from-json<provides>
.grep(*.value.starts-with("lib")).Hash.keys
.map({ use-ok $_ })

Моя проблема здесь в том, что есть несколько файлов, которые содержат определение подпрограммы MAIN. Из выходных данных, которые я вижу при запуске prove -e 'perl6 -Ilib' t, похоже, что один из файлов выполняет свои MAIN, а затем тестирование останавливается.

Я хочу проверить, могут ли эти файлы быть used правильно, без фактического запуска MAIN подпрограмм, определенных в них. Как мне это сделать?


person Tyil    schedule 09.10.2018    source источник
comment
тио кажется не запускать MAINs. код для use-ok выполняет EVAL ( "use $code" );. stackoverflow.com/questions/40778852/   -  person raiph    schedule 09.10.2018
comment
Какой модуль работает в ГЛАВНОМ?   -  person Christopher Bottoms    schedule 11.10.2018
comment
Ни один из них не вызывает MAIN, есть три файла, которые определяют MAIN и экспортируют его. Во время тестирования, когда модуль, определяющий MAIN, тестируется с use-ok, запускается MAIN и тестирование останавливается. Это моя проблема, я не хочу, чтобы MAIN запускался, когда я использую use-ok.   -  person Tyil    schedule 11.10.2018
comment
@ChristopherBottoms: новая страница docs.perl6.org/language/create-cli может объясни это немного.   -  person Elizabeth Mattijsen    schedule 16.10.2018


Ответы (1)


MAIN файла выполняется только в том случае, если он находится на верхнем уровне основной линии программы. Так:

sub MAIN() is export { }     # this will be executed when the mainline executes

Однако, если вы переместите MAIN подпрограмму из верхнего уровня, она не будет выполнена. Но вы все равно можете экспортировать его.

{
    sub MAIN() is export { } # will *not* execute
}

Извините за то, что так долго отвечал: мне потребовалось время, чтобы понять, в чем был вопрос :-)

person Elizabeth Mattijsen    schedule 15.10.2018
comment
Я хочу, чтобы MAIN выполнялся при выполнении mainline, но я не хочу, чтобы он выполнялся во время тестирования с use-ok. - person Tyil; 16.10.2018
comment
Вы хотите, чтобы ОСНОВНАЯ выполнялась, когда вы делаете use? - person Elizabeth Mattijsen; 16.10.2018
comment
Да, когда я use это из обычного сценария Perl 6, я хочу, чтобы MAIN был импортирован и выполнен (конечно, когда аргументы верны). - person Tyil; 16.10.2018
comment
Тогда мое решение, приведенное выше, должно делать то, что вы хотите. Также для use-ok. Или я все еще что-то упускаю? - person Elizabeth Mattijsen; 16.10.2018