如何使用 Minitest 测试命令行 gem



我想用 Minitest 测试我的红宝石。我不知道如何设置测试文件来测试命令行参数。我知道我的命令行参数将来自变量ARGV,但我不知道如何通过 Minitest 访问它。

我还需要知道我是否必须需要bin文件夹中的可执行文件或特定的 ruby 文件(在本例中为名为CLI.rb的文件(。

这个答案是我在 Stackoverflow 上找到的最接近的答案,但答案似乎与我试图做的事情相去甚远,至少据我所知是这样。

不要在测试中弄乱ARGV。这是一个常数,应该这样对待。相反,解耦您需要测试的代码,以便您可以将所需的任何数据传递给它。exe 应该只实例化 CLI 类,并将ARGV传递给它。没有必要测试该文件,只需确保它运行,因为它是如此基本。

下面是你的 exe 应该是什么样子的:

require 'mygem'
MyGem::CLI.new(ARGV).run

命令行代码:

module MyGem
class CLI
def initialize(argv)
@options = parse_argv(argv)
end
def run
# main code here
end
private
def parse_argv(argv)
# I'd use getoptlong for this since it's built in to Ruby.
end
end
end

然后你的测试将如下所示:

require 'test_helper'
module MyGem
class CLITest < MiniTest::Test
def test_help_with_no_args
out, err = capture_io { CLI.new([]).run }
assert_empty err, 'nothing should be written to STDERR'
refute_empty out, 'help should be written to STDOUT'
end
end
end

最新更新