2011-12-24 29 views
7
ARGV của ARGV

Tôi có một ứng dụng dòng lệnh sử dụng thor để xử lý việc phân tích các tùy chọn. Tôi muốn đơn vị kiểm tra chức năng dòng lệnh chống lại mã với đơn vị kiểm tra và/hoặc minitest. Tôi không thể tìm ra cách đảm bảo mảng ARGV (thường sẽ giữ các tùy chọn từ dòng lệnh) giữ các tùy chọn kiểm tra của tôi để chúng có thể được kiểm tra dựa trên mã.đơn vị kiểm tra mã của ứng dụng dòng lệnh ruby ​​- cách mô phỏng/vượt qua

Mã ứng dụng cụ thể:

# 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 

Các thực thi

# bin/myapp 

Các thử nghiệm file

# 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 

tôi đã có thể vượt qua một mảng vào argv trong lớp kiểm tra, nhưng một khi tôi gọi Myapp/Lệnh/Xây dựng ARGV dường như trống. Tôi cần phải chắc chắn rằng các mảng ARGV đang nắm giữ 'xây dựng' và 'html' để cho các Xây dựng lệnh để làm việc và điều này để vượt qua.

Trả lời

0

Bạn đã thử ARGV = ['build', 'html'] chưa?

Bạn có thể nhận được cảnh báo nhưng nó sẽ cho bạn ảnh hưởng mong muốn.

Theo this bạn thậm chí không cần sử dụng ARGV.

2

Mẫu tốt hơn sẽ là trừu tượng hóa việc sử dụng trực tiếp ARGV để thử nghiệm. Với thiết kế hiện tại của bạn, bạn có thể làm một module gọi là cái gì đó như CommandLineArguments và cung cấp truy cập theo cách đó:

module CommandLineArguments 
    def argv; ARGV; end 
end 

Trong mã chính của bạn:

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

    args = argv 
    build = args.shift 

Cuối cùng, trong thử nghiệm của bạn, bạn có thể sửa đổi các mô-đun hoặc lớp kiểm tra của bạn:

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 

Nếu điều này có vẻ phức tạp, đúng vậy. Bạn có thể được phục vụ tốt hơn bằng cách giải nén phần lớn mã của bạn vào các lớp thực tế và sau đó sử dụng chúng trong tệp thi hành được Thor hỗ trợ của bạn (thay vì có tất cả mã đó trong tệp thi hành).

+0

Cảm ơn, Dave! Chính xác những gì tôi đang tìm kiếm. Trong thời gian chờ đợi, tôi đọc cuốn sách của bạn [Xây dựng các ứng dụng dòng lệnh tuyệt vời trong Ruby] (http://pragprog.com/book/dccar/build-awesome-command-line-applications-in-ruby). ;-) Tôi thực hiện aruba với dưa chuột để ít nhất có được thử nghiệm chấp nhận đi. –

0

ARGV.concat %w{build html}, ví dụ ?!

Các vấn đề liên quan