модульное тестирование кода приложения командной строки ruby ​​- как имитировать / передавать ARGV

У меня есть приложение командной строки, в котором для обработки опций используется тор. Я хочу провести модульное тестирование функциональности командной строки в сравнении с кодом с помощью 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 содержатся «build» и «html», чтобы команда Build работала и это проходило.

6
задан Dave Thompson 24 December 2011 в 00:11
поделиться