2011-12-24 19 views
7

Mam aplikację wiersza polecenia, która używa thor do obsługi parsowania opcji. Chcę przetestować funkcjonalność wiersza poleceń pod kątem kodu z jednostką testową i/lub minitestem.jednostka testująca kod aplikacji wiersza poleceń - jak symulować/przekazywać ARGV

Nie mogę się dowiedzieć, jak upewnić się, że tablica ARGV (która normalnie przechowuje opcje z wiersza poleceń) przechowuje moje opcje testowe, aby można było je przetestować pod kątem kodu.

Konkretny kod aplikacji:

# 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 

wykonywalny

# bin/myapp 

pliku testowego

# 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 

udało mi się przekazać tablicę do ARGV w klasie testowej ale kiedy zadzwonię do Myapp/Commands/Build, ARGV wydaje się być pusty. Muszę się upewnić, że tablica ARGV trzyma "build" i "html", aby polecenie Build działało i to się udało.

Odpowiedz

0

Czy próbowałeś ARGV = ['build', 'html']?

Możesz otrzymać ostrzeżenie, ale powinno to dać ci pożądany efekt.

Według this w ogóle nie powinno się używać ARGV.

2

Lepszym wzorcem byłoby wyodrębnienie bezpośredniego użycia ARGV do testowania. Biorąc pod uwagę twój obecny projekt, można zrobić moduł o nazwie coś CommandLineArguments i zapewnić dostęp w ten sposób:

module CommandLineArguments 
    def argv; ARGV; end 
end 

w głównym kodzie:

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

    args = argv 
    build = args.shift 

Wreszcie, w teście, można zmodyfikować moduł lub twoja klasa testowa:

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 

Jeśli wydaje się to dość skomplikowane, tak jest. Możesz być lepiej obsługiwany poprzez wyodrębnienie większości kodu do rzeczywistych klas, a następnie użycie ich w pliku wykonywalnym Thor (zamiast posiadania całego kodu w pliku wykonywalnym).

+0

Dzięki, Dave! Dokładnie to, czego szukałem. W międzyczasie skończyłem czytać twoją książkę [Budowanie niesamowitych aplikacji wiersza poleceń w Ruby] (http://pragprog.com/book/dccar/build-awesome-command-line-applications-in-ruby). ;-) Zaimplementowałem arubę z ogórkiem, aby przynajmniej przeprowadzić testy akceptacyjne. –

Powiązane problemy