2011-12-24 5 views
7

को अनुकरण/पास करने के लिए कैसे करें मेरे पास एक कमांड लाइन एप्लिकेशन है जो विकल्पों के विश्लेषण को संभालने के लिए थोर का उपयोग करता है। मैं इकाई-परीक्षण और/या न्यूनतम के साथ कोड के खिलाफ कमांड लाइन कार्यक्षमता का परीक्षण करना चाहता हूं।इकाई एक रूबी कमांड लाइन एप्लिकेशन के कोड का परीक्षण - एआरजीवी के

मैं यह पता लगाने कैसे यकीन है कि 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 में एक सरणी पारित करने में सक्षम किया गया है, लेकिन एक बार जब मैं माईप/कमांड/एआरजीवी का निर्माण करता हूं तो खाली दिखाई देता है। मुझे यह सुनिश्चित करने की ज़रूरत है कि बिल्ड कमांड काम करने के लिए एआरजीवी सरणी 'बिल्ड' और 'एचटीएमएल' रख रही है और इसे पास करने के लिए।

उत्तर

0

क्या आपने ARGV = ['build', 'html'] की कोशिश की है?

आपको चेतावनी मिल सकती है लेकिन इसे आपको वांछित प्रभाव देना चाहिए।

this के अनुसार तुम भी बिल्कुल ARGV उपयोग करने की आवश्यकता नहीं होनी चाहिए।

2

एक बेहतर पैटर्न परीक्षण के लिए ARGV से बाहर सार प्रत्यक्ष उपयोग करने के लिए किया जाएगा। अपने मुख्य कोड में

module CommandLineArguments 
    def argv; ARGV; end 
end 

: अपने वर्तमान डिजाइन को देखते हुए, आप CommandLineArguments की तरह एक मॉड्यूल कुछ कहा बनाने के लिए और पहुँच कि जिस तरह से प्रदान कर सकता है

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 

यदि यह अपेक्षाकृत जटिल लगता है, तो यह है। आप अपने अधिकांश कोड को वास्तविक कक्षाओं में निकालने के द्वारा बेहतर सेवा प्रदान कर सकते हैं और फिर उन्हें अपने थोर-संचालित निष्पादन योग्य (निष्पादन योग्य में सभी कोड रखने के बजाय) का उपयोग कर सकते हैं।

+0

धन्यवाद, डेव! ठीक वही जो मेरे द्वारा खोजा जा रहा था। इस बीच में मैंने आपकी पुस्तक [रूबी में बहुत बढ़िया कमांड लाइन अनुप्रयोगों को पढ़ना] समाप्त किया (http://pragprog.com/book/dccar/build-awesome-command-line-plplications-in-ruby)। ;-) मैंने कम से कम स्वीकृति परीक्षण प्राप्त करने के लिए ककड़ी के साथ अरुबा लागू किया। –

0

ARGV.concat %w{build html} में मिला, उदाहरण के लिए ?!

संबंधित मुद्दे