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

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

Ответы [ 4 ]

5 голосов
/ 14 декабря 2013

Самый простой способ установить ARGV и избежать предупреждения - это сделать:

ARGV.replace your_argv

Найдено в http://apidock.com/ruby/Test/Unit/setup_argv/class

2 голосов
/ 31 декабря 2011

Лучшим вариантом было бы абстрагирование прямого использования 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 (вместо того, чтобы хранить весь этот код в исполняемом файле).

0 голосов
/ 18 мая 2015

ARGV.concat %w{build html}, например?!

0 голосов
/ 25 декабря 2011

Вы пробовали ARGV = ['build', 'html']?

Вы можете получить предупреждение, но оно должно дать вам желаемый эффект.

Согласно этому вам даже не нужно вообще использовать ARGV.

...