Как запустить тестовый Perl-скрипт, предназначенный для проверки формы внутри TextMate? - PullRequest
2 голосов
/ 21 января 2012

Я использую TextMate 1.5.10 (Mac OSX 10.7.2) для написания приложения perl modulino . Для проверки работоспособности я использую тестовые сценарии, разработанные для запуска с помощью инструмента командной строки prove.

Пример структуры каталогов, которую я использую, выглядит следующим образом:

text_mate_test/MyModule.pm
text_mate_test/t/001_load_test.t

Файл 001_load_test.t выглядит так:

#!/usr/bin/perl 

use Modern::Perl;
use Test::More;
use MyModule;

my $testObj = new_ok("MyModule", undef, "Initial load test.");

done_testing();

Когда я запускаю prove или prove -v в каталоге "text_mate_test", все проходит как положено.

Я хотел бы иметь возможность установить горячую клавишу в TextMate, которая позволяет мне запускать тестовый файл без необходимости перепрыгивать на терминал. В настоящее время, если я запускаю «001_load_test.t» непосредственно из TextMate с помощью Cmd + R, он задыхается, говоря: «Не удается найти MyModule.pm в @INC». Это ожидается, поскольку тестовый скрипт не предназначен для непосредственного запуска. (Я все еще довольно новичок в написании тестовых файлов, но я считаю, что это правильный способ их настройки.)

Если исходить из предположения, что я не хочу менять сам тестовый файл, есть ли способ настроить горячую клавишу, чтобы я мог точно запустить файл из TextMate?

Ответы [ 3 ]

2 голосов
/ 21 января 2012

Я нашел еще лучший способ сделать это.

В редакторе пакетов TextMate (меню -> Пакеты -> Редактор пакетов -> Показать редактор пакетов) я обновил стандартный пакет Perl -> «Выполнить скрипт» по умолчанию:

#!/usr/bin/env ruby

require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/executor"
require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/save_current_document"

TextMate.save_current_document
TextMate::Executor.make_project_master_current_document

### If it's a ".t" test script in a "t" directory, run prove
if ( ENV["TM_FILEPATH"] =~ /^.*\/(t\/[^\/]+)$/ )

    ### Grab the relative file path for more legible output
    relative_file_path = $1

    ### Jump up one directory so prove will work
    Dir.chdir("../");

    ### Call prove with args to run only the file you are working on.
    TextMate::Executor.run("prove", :script_args => ["-v", relative_file_path]);

### Otherwise, run with perl
else
    TextMate::Executor.run(ENV["TM_PERL"] || "perl", "-I#{ENV["TM_BUNDLE_SUPPORT"]}", 
        "-Mexception_handler", ENV["TM_FILEPATH"], 
        :version_args => ["-e", 'printf "Perl v%vd", $^V;'])
end

Вот скриншот того, как это выглядит в редакторе пакетов.

TextMate Bundle Editor Screen Shot for using prove to run perl test scripts

Преимущество этого заключается в том, что вы можете использовать одну и ту же горячую клавишу (по умолчанию Cmd + r) для запуска ваших обычных скриптов с помощью perl и ваших тестовых скриптов с помощью proof.

Это то, что я искал.


ОБНОВЛЕНО: Когда я впервые разработал это, у меня был только один тестовый скрипт в каталоге "t". Пока я не добавил другие тестовые сценарии, я не заметил, что код в исходной версии этого ответа будет работать для всех сценариев. Не только тот, над которым ведется работа. Чтобы вернуться к ожидаемому поведению, я обновил код комплекта, чтобы проверка работала только на активном сценарии.

1 голос
/ 21 января 2012

Я придумала решение. Создайте новый пакет Perl под названием «Run Script with proof» и свяжите его с Shift-Cmd-R. Код для пакета:

#!/usr/bin/env ruby

require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/executor"
require "#{ENV["TM_SUPPORT_PATH"]}/lib/tm/save_current_document"

TextMate.save_current_document
TextMate::Executor.make_project_master_current_document


### If it's a ".t" test script in a "t" directory, run prove
if ( ENV["TM_FILEPATH"] =~ /^.*\/(t\/[^\/]+)$/ )

    ### Use the relative file path for more legible output
    relative_file_path = $1

    ### Jump up one directory so prove will work
    Dir.chdir("../");

    ### Call prove with args to run only the file you are working on.
    TextMate::Executor.run("prove", :script_args => ["-v", relative_file_path]);

else

    error_string = "This script's filepath doesn't end with /t/.*\.t\n"
    error_string += "That is required for the 'Perl -> Run Script with prove' bundle to work.\n"

    TextMate::Executor.run("echo", :script_args => [error_string]);

end

Примечание. Это результаты нескольких проб и ошибок. Я не знаю, правильно ли это делать, но это работает для меня. Все, кроме двух последних строк, является копией оригинального пакета «Run Script», поставляемого с TextMate. Исходя из этого, кажется, что это должно быть довольно безопасно.

ОБНОВЛЕНИЕ: Когда я впервые построил это, у меня был только один тестовый файл в каталоге "t". Когда я добавил больше, я обнаружил, что в исходной версии пакета были запущены все тестовые файлы. Этот код представляет собой обновление ожидаемого поведения только запуска тестового сценария, над которым вы работаете. Из-за того, как я это сделал, также возникла необходимость добавить запасной вариант. Если вы попытаетесь запустить скрипт, который не соответствует стандартному формату пути к тестовому файлу, он выдаст сообщение об ошибке.

0 голосов
/ 21 января 2012

Это позволит программе найти ваш модуль, если вы добавите

use lib '..';

в начало вашего кода (перед use MyModule).Это добавит каталог text_mate_test в @INC и позволит Perl найти модуль, хотя у вас могут возникнуть другие проблемы с прямым запуском программы.

...