要重申
您既可以通過只磕碰puts
命令實現這一目標我看到它的問題:「我有一個ruby文件,它定義了方法並運行了其他命令,我怎樣才能在不運行命令的情況下測試這些方法?」
如果你的腳本的命令,完全是爲了輸出 - puts
,日誌記錄,調試,stdout
或stderr
等 - 那麼這裏其他的答案是綽綽有餘了。
但是如果你的命令正在做其他的事情,比如設置默認值或者執行有效的加載時間工作呢?或者,也許您的文件被設計爲作爲獨立腳本運行和/或其他文件需要?
解決方案#1:考慮重構
第一個要問的問題是,是否是有意義的重構你的代碼。是否有任何非方法命令(或一系列命令)可用於包含在其他文件中?您是否對運行非方法命令的單元測試感興趣?如果答案都是「是」,那麼通過將方法中的獨立命令包裝起來可以更好地滿足您的需求。
# other methods
def run_something
# do stuff
end
run_something
一般來說,它是很好的做法,讓您的可執行文件儘可能的小,讓他們從你的類和方法定義分離(小bin
,大lib
)。擴展上面的例子中,你有這樣的事情:
在lib/something.rb
:
# other methods
def run_something
# do stuff
end
在bin/something.rb
:
require_relative '../lib/something.rb'
run_something
解決方案2:條件執行
每當一個文件運行或加載/需要,文件中的所有命令立即執行。這些命令是類/方法定義還是獨立命令沒有區別。如果你有當另一個文件(如require 'something.rb'
)加載文件時直接運行應該執行(如ruby something.rb
),但不執行任何獨立的命令,你可以測試這種情況,像這樣:
if __FILE__ == $PROGRAM_NAME
run_something
end
__FILE__
是魔法值,在ruby-doc.org記錄如下:
文件的當前正在執行,包括路徑相對 到該應用程序啓動的目錄(或當前 目錄,如果它一直是名改變)。當前文件在某些 的情況下與正在運行的應用程序的啓動文件 不同,後者在全局變量$ 0中可用。
$0
和$PROGRAM_NAME
都是全局變量,可以互換使用(一個是另一個的別名)。
因此表達式if __FILE__ == $PROGRAM_NAME
轉換爲「如果當前文件是啓動文件」。