2008-12-03 35 views
5

在ruby中,有沒有一種方法可以在定義變量或常量時「取消」定義?是否有可能取消定義一個變量在紅寶石?

在我們的軌道environemnts,我們定義了三個contants一個是true,根據環境:TESTINGDEVELOPMENT,或PRODUCTION。然後,在控制器代碼中,我們使用defined?來查看我們所處的環境,即:defined? PRODUCTION

現在,我想單元測試一些特定於環境的行爲。我最初的嘗試是在我的測試中設置合適的常量,然後在拆卸過程中重置它們。但是,我不知道如何重置DEVELOPMENTPRODUCTION,使defined?返回false。

顯然,一個解決辦法是隻檢查,看看是否合適的常數也此外,如果它被定義檢查真實的,但是這將導致不得不觸及現有的代碼中有相當。

編輯:我意識到這絕對不是正確的做事方式。唉,改變它是一項不重要的任務,所以我正在尋找一種簡單的方法來單元測試現在有什麼。另外,我也只是對低級語言問題是否可以取消定義變量/常量感到好奇。

回答

8

我發現this answer

Object.send(:remove_const, "TESTING") 

如果我沒有記錯,使用send這裏是怎樣的一個黑客,因爲remove_const是一個真正的私有方法。你想問自己,爲什麼你需要同時定義常量PRODUCTION,DEVELOPMENT和TESTING,而他們真的是相互排斥的;這就是爲什麼我高舉了greulawk的答案。

+0

這正是我一直在尋找,哈克或沒有(它的單元測試代碼,所以我並不十分擔心,它是私有的)。謝謝! – 2008-12-04 01:37:34

1

而是檢查每個不變的,爲什麼不這樣做:

environment = :TESTING 

if(environment == :TESTING) 
3

它意義不大使用三個真/假變量是相互排斥的條件。例如,如果開發和生產同時設置,會發生什麼情況。

相反,有一個變量,它表明你在哪個環境,設置ENVIRON到集(DEVTESTPROD)或類似的東西之一。

然後,您可以將ENVIRON與您希望執行的每個操作的三者之一進行比較。

5

嗯,我猜,因爲這是標記,我們正在談論的Rails ......這裏的環境是存儲在RAILS_ENV已經這樣做類似的作品就好RubyOnRails ...

if (RAILS_ENV == "production") ... 

我猜你也可以把它寫這樣的:

RAILS_ENV.include?("development")