【问题标题】:How to test a command line gem with Minitest如何使用 Minitest 测试命令行 gem
【发布时间】:2019-12-26 11:37:10
【问题描述】:

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

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

This 答案是我在 Stackoverflow 上找到的最接近的答案,但答案似乎与我想要做的事情相去甚远,至少据我所知。

【问题讨论】:

  • 如果你想做一个“黑盒”测试,你可以调用带有 shell 命令插值的可执行文件,例如反引号。要测试内部结构,您应该将 gem 源代码从测试加载到内存中。如果您的库引用 ARGV,也许您应该重构它以接收该值作为参数。这将使从测试中传递自定义值变得更加容易。
  • 它不引用 ARVG,除非在需要 CLI.rb 的单个文件中。该文件中的一行代码是CLI.new.run(ARGV)。除此之外,您是说我可以简单地在我的测试文件中要求 CLI.rb 并运行该文件以对其进行测试?
  • 是的,您可以在测试中致电CLI.new.run(some_arguments_list)

标签: ruby minitest argv


【解决方案1】:

不要在你的测试中搞乱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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多