2

我正在使用 TextMate 1.5.10 (Mac OSX 10.7.2) 编写perl modulino application。为了验证该功能,我使用了旨在与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();

当我运行proveprove -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 Bundle Editor 屏幕截图

这样做的好处是您可以使用相同的热键(默认为 Cmd+r)使用 perl 运行您的普通脚本,并使用证明运行您的测试脚本。

这就是我一直在寻找的。


更新:当我第一次开发这个时,我在“t”目录中只有一个测试脚本。直到我添加了其他测试脚本,我才注意到这个答案的原始版本中的代码将在所有脚本中运行证明。不只是正在研究的那个。为了回到预期的行为,我更新了捆绑代码,以便证明只能在活动脚本上运行。

于 2012-01-21T04:22:03.323 回答
1

我想出了一个解决方案。创建一个名为“Run Script with proof”的新 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

注意:这是一堆试验和错误黑客的结果。我不知道这样做是否“正确”,但这对我有用。除了最后两行之外的所有内容都是 TextMate 随附的原始“运行脚本”包的副本。基于此,看起来这应该是相当安全的。

更新:当我第一次构建它时,我在“t”目录中只有一个测试文件。当我添加更多时,我发现捆绑包的原始版本正在运行所有测试文件。此代码表示对仅运行您正在处理的测试脚本的预期行为的更新。由于我最终这样做的方式,也有必要添加一个后备。如果您尝试运行与标准测试文件路径格式不匹配的脚本,则会显示错误消息。

于 2012-01-21T01:23:06.763 回答
0

如果您添加,它将使程序能够找到您的模块

use lib '..';

到代码的顶部(在 之前use MyModule)。这会将text_mate_test目录添加到@INC 并使Perl 能够找到该模块,尽管您可能会在直接运行程序时遇到其他问题。

于 2012-01-21T01:00:24.330 回答