2

私はTextMate1.5.10(Mac OSX 10.7.2)を使用してperlmodulinoアプリケーションを作成しています。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に設定できるようにしたいと思います。現在、Cmd + Rを使用してTextMate内から直接「001_load_test.t」を実行すると、「@INCでMyModule.pmが見つかりません」というメッセージが表示されます。テストスクリプトは直接実行するように設計されていないため、これは予想されることです。(私はまだテストファイルを書くのはかなり新しいですが、それがそれらを設定するための適切な方法だと思います。)

テストファイル自体を変更したくないという前提から外して、TextMate内からファイルを正確に実行できるようにホットキーを設定する方法はありますか?

4

3 に答える 3

2

私はこれを行うためのさらに良い方法を考え出しました。

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

これは、バンドルエディタでどのように表示されるかのスクリーンショットです。

証明を使用してperlテストスクリプトを実行するためのTextMateバンドルエディタのスクリーンショット

これの利点は、同じホットキー(デフォルトではCmd + r)を使用して、perlで通常のスクリプトを実行し、proverでテストスクリプトを実行できることです。

これが私が探していたものです。


更新:これを最初に開発したとき、「t」ディレクトリにはテストスクリプトが1つしかありませんでした。他のテストスクリプトを追加するまで、この回答の元のバージョンのコードがすべてのスクリプトで証明されることに気づきませんでした。取り組んでいるものだけではありません。期待される動作に戻すために、バンドルコードを更新して、proveがアクティブなスクリプトでのみ実行されるようにしました。

于 2012-01-21T04:22:03.323 に答える
1

私は解決策を考え出しました。「RunScriptwithprove」という新しいPerlバンドルを作成し、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

注:これは、試行錯誤の結果です。それが「正しい」かどうかはわかりませんが、これは私にとってはうまくいきます。最後の2行を除くすべては、TextMateに付属している元の「スクリプトの実行」バンドルからのコピーです。それに基づいて、これはかなり安全なはずです。

更新:これを最初にビルドしたとき、「t」ディレクトリにはテストファイルが1つしかありませんでした。さらに追加すると、バンドルの元のバージョンがすべてのテストファイルを実行していることがわかりました。このコードは、作業中のテストスクリプトのみを実行する場合に予想される動作の更新を表しています。私がそれをやった方法のために、フォールバックを追加することも必要になりました。標準のテストファイルパス形式と一致しないスクリプトを実行しようとすると、エラーメッセージが表示されます。

于 2012-01-21T01:23:06.763 に答える
0

追加すると、プログラムがモジュールを見つけることができるようになります

use lib '..';

コードの先頭(の前use MyModule)に。これにより、text_mate_testディレクトリが@INCに追加され、Perlがモジュールを検出できるようになりますが、プログラムを直接実行すると他の問題が発生する可能性があります。

于 2012-01-21T01:00:24.330 に答える