2011-01-03 21 views
6

Tôi đang thử nghiệm một số tập lệnh giao diện với lệnh hệ thống. Logic của chúng phụ thuộc vào mã trả về của các lệnh hệ thống, tức là giá trị của $ ?. Vì vậy, như một ví dụ đơn giản, các kịch bản có thể nói:

def foo(command) 
    output=`#{command}` 
    if $?==0 
    'succeeded' 
    else 
    'failed' 
    end 
end 

Để có thể kiểm tra những phương pháp đúng, tôi muốn để có thể còn sơ khai ra Kernel backquote cuộc gọi, và đặt $? đến một giá trị tùy ý, để xem tôi có nhận được hành vi thích hợp từ logic trong phương thức sau cuộc gọi backquote hay không. $? là biến chỉ đọc, vì vậy các biến sau không hoạt động:

$? = some_number 

Tôi có thể làm một số công cụ đơn giản: ví dụ: đặt $? không hoặc không khác. Ví dụ: sẽ đặt $? hoặc 0 hoặc 35212 (trên hệ thống của tôi, dù sao), tùy thuộc vào giá trị của $ ?:

def fail_or_succeed(success) 
    if success 
    `echo foo` 
    else 
    `a-non-existent-command 2>&1` 
    end 
end 

Điều tôi thực sự muốn làm là đặt $? với một giá trị cụ thể (ví dụ: 3 hoặc 122), không chỉ bằng 0 hoặc tùy ý khác. Tôi không thể tìm ra cách để làm điều này. (Trong trường hợp vấn đề, tôi đang thử nghiệm sử dụng Test :: Unit và Mocha.)

Trả lời

10

EDIT: Sử dụng gợi ý Dennis Williamson:

command = "(exit 21)" 

và sử dụng if $?.exitstatus == 0 thay vì if $? == 0

+0

Aha! Cảm ơn, đó là công trình. Tôi đã thử ý tưởng của bạn, nhưng đã bỏ lỡ phần .exitstatus. Tôi đã sử dụng .to_i (có hiệu lực), trả về (trong ví dụ của bạn) 5376, không phải là 21. – rleber

+0

@ rleber: Nó có thể đơn giản như 'command = '(exit 21)'' (bạn có thể bỏ qua "bash - c "nếu bạn quấn nó trong dấu ngoặc đơn). –

+0

@ Dennis, Nice - nó đơn giản và đáng tin cậy hơn (khi bash không có trong '$ PATH'). –

1
module Stubbed 
    def `(*args) 
    super("mycommand that returns the error code I want") 
    end 
end 

Bao gồm điều này vào đối tượng của bạn khi cần thiết?

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