如何使用 Minitest 测试命令行 gem
How to test a command line gem with Minitest
我想使用 Minitest 测试我的 ruby gem。我不知道如何设置测试文件来测试命令行参数。我知道我的命令行参数将来自变量 ARGV
,但我不知道如何通过 Minitest 访问它。
我还需要知道我是否需要 bin
文件夹中的可执行文件,或特定的 ruby 文件(在本例中为名为 CLI.rb
的文件)。
This 答案是我在 Whosebug 上找到的最接近的答案,但答案似乎与我正在尝试做的事情相去甚远,至少在我力所能及的范围内是这样告诉.
不要在测试中弄乱 ARGV
。它是一个常量,应该这样对待。相反,分离你需要测试的代码,这样你就可以传递任何你想要的数据。 exe 应该只实例化 CLI class,并将 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
我想使用 Minitest 测试我的 ruby gem。我不知道如何设置测试文件来测试命令行参数。我知道我的命令行参数将来自变量 ARGV
,但我不知道如何通过 Minitest 访问它。
我还需要知道我是否需要 bin
文件夹中的可执行文件,或特定的 ruby 文件(在本例中为名为 CLI.rb
的文件)。
This 答案是我在 Whosebug 上找到的最接近的答案,但答案似乎与我正在尝试做的事情相去甚远,至少在我力所能及的范围内是这样告诉.
不要在测试中弄乱 ARGV
。它是一个常量,应该这样对待。相反,分离你需要测试的代码,这样你就可以传递任何你想要的数据。 exe 应该只实例化 CLI class,并将 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