单元测试 Ruby 命令行应用程序的代码 - 如何模拟/传递 ARGV



我有一个命令行应用程序,它使用thor来处理选项解析。我想用test-unit和/或minitest对代码对命令行功能进行单元测试。

我似乎不知道如何确保ARGV数组(通常会保存命令行中的选项)保存我的测试选项,以便它们可以针对代码进行测试。

具体应用代码:

# myapp/commands/build.rb
require 'thor'
module Myapp
  module Commands
    # Define build commands for MyApp command line
    class Build < Thor::Group
      include Thor::Actions
      build = ARGV.shift
      build = aliases[build] || build
      # Define arguments and options
      argument :type
      class_option :test_framework, :default => :test_unit
      # Define source root of application
      def self.source_root
        File.dirname(__FILE__)
      end
      case build
      # 'build html' generates a html
      when 'html'
        # The resulting html
        puts "<p>HTML</p>"
      end
    end
  end
end

可执行

# bin/myapp

测试文件

# tests/test_build_html.rb
require 'test/unit'
require 'myapp/commands/build'

class TestBuildHtml < Test::Unit::TestCase
  include Myapp::Commands
  # HERE'S WHAT I'D LIKE TO DO
  def test_html_is_built
    # THIS SHOULD SIMULATE 'myapp build html' FROM THE COMMAND-LINE
    result = MyApp::Commands::Build.run(ARGV << 'html')
    assert_equal result, "<p>HTML</p>"
  end
end

我已经能够在测试类中将数组传递到ARGV,但是一旦我调用Myapp/Commands/Build, ARGV似乎是空的。我需要确保ARGV数组持有'构建'和'html',以便构建命令工作,这是通过的。

设置ARGV和避免警告的最简单方法是:

ARGV.replace your_argv

发现于http://apidock.com/ruby/Test/Unit/setup_argv/class

一个更好的模式是将ARGV的直接使用抽象出来进行测试。考虑到您当前的设计,您可以创建一个名为CommandLineArguments的模块,并以这种方式提供访问:

module CommandLineArguments
  def argv; ARGV; end
end

在你的主代码中:

class Build < Thor::Group
  include CommandLineArguments
  include Thor::Actions
  args = argv
  build = args.shift

最后,在测试中,您可以修改模块或测试类:

def setup
  @myargs = nil
end
class MyApp::Commands::Build
  def argv; @myargs || ARGV; end
end
def test_html_is_built
  @myargs = %w(html)
  result = MyApp::Commands::Build.run
end

如果这看起来相当复杂,它就是。如果将大部分代码提取到实际的类中,然后在thor支持的可执行文件中使用它们(而不是在可执行文件中使用所有代码),可能会更好。

ARGV.concat %w{build html},例如?!

您尝试过ARGV = ['build', 'html']吗?

你可能会得到一个警告,但它应该会给你想要的效果。

根据这个,你甚至不需要使用ARGV

相关内容

  • 没有找到相关文章

最新更新