我想使用Minitest测试我的红宝石宝石。我不知道如何设置测试文件来测试命令行参数。我知道我的命令行参数将来自变量ARGV
,但我不知道如何通过Minitest访问它。
我还需要知道是否需要bin
文件夹中的可执行文件或特定的ruby文件(在这种情况下,称为CLI.rb
的文件)。
This答案是我在Stackoverflow上找到的最接近的答案,但答案似乎与我试图做的有用的事情相去甚远,至少据我所知。
[不要在测试中弄乱ARGV
。这是一个常数,应该这样对待。而是将需要测试的代码解耦,这样就可以将所需的任何数据传递给它。 exe应该只实例化CLI类,然后将ARGV
传递给它。因为它是如此的基础,所以不需要仅仅为了确保文件运行就测试该文件。
这是您的exe外观:
require 'mygem'
MyGem::CLI.new(ARGV).run
CLI代码:
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