如何使用 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