我想用 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