2011-12-24 7 views
7
de ARGV

Tengo una aplicación de línea de comandos que usa thor para manejar el análisis de las opciones. Quiero probar de forma unitaria la funcionalidad de la línea de comandos contra el código con test-unit y/o minitest.unidad probando un código de la aplicación de la línea de comando de ruby ​​- cómo simular/pasar el

Parece que no puedo encontrar la manera de asegurarme de que la matriz ARGV (que normalmente contendría las opciones desde la línea de comandos) contiene mis opciones de prueba para que puedan probarse contra el código.

El código de la aplicación específica:

# 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 

El ejecutable

# bin/myapp 

el archivo de prueba

# 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 

he sido capaz de pasar una matriz en ARGV en la clase de prueba, pero una vez que llamo a Myapp/Commands/Build, el ARGV parece estar vacío. Necesito asegurarme de que la matriz ARGV tenga 'build' y 'html' para que el comando Build funcione y esto pase.

Respuesta

0

¿Has probado ARGV = ['build', 'html']?

Puede recibir una advertencia, pero debería darle el efecto deseado.

De acuerdo con this, no debería necesitar usar ARGV en absoluto.

2

Un mejor patrón sería abstraer el uso directo de ARGV para la prueba. Dado su diseño actual, usted podría hacer un módulo llamado algo así como CommandLineArguments y facilitar el acceso de esa manera:

module CommandLineArguments 
    def argv; ARGV; end 
end 

En su código principal:

class Build < Thor::Group 
    include CommandLineArguments 
    include Thor::Actions 

    args = argv 
    build = args.shift 

Por último, en su prueba, puede modificar el módulo o su clase de prueba:

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 

Si esto parece bastante complejo, lo es. Es posible que te sirva mejor extrayendo la mayoría de tu código en clases reales y luego utilízalos en tu ejecutable impulsado por Thor (en lugar de tener todo ese código en el ejecutable).

+0

¡Gracias, Dave! Exactamente lo que estaba buscando. Mientras tanto, terminé leyendo su libro [Creación de aplicaciones de línea de comandos increíbles en Ruby] (http://pragprog.com/book/dccar/build-awesome-command-line-applications-in-ruby). ;-) Implementé aruba con pepino para al menos obtener la prueba de aceptación. –

0

ARGV.concat %w{build html}, por ejemplo ?!

Cuestiones relacionadas