2014-12-19 93 views
5

我有幾個ruby腳本,並用rspec測試它們。如何在運行rspec for ruby​​時更改環境變量?

我把我的環境放在一個env.rb文件(現在),所以我可以在本地訪問它們,並在生產環境中將它們放入配置變量中。

但是當我運行rspec時,我想要不同的環境變量。兩個用例:

  • 我跑Twilio,所以我希望能夠更改用於他們的測試憑據
  • 我存儲的東西在數據庫作爲服務的SID,並希望有一個獨立的測試數據庫
+0

您應該在測試套件中使用環境變量。所以用你的其他憑證而不是生產憑證初始化Twillio客戶端。 – Anthony 2014-12-19 13:01:03

+0

如何在測試套件中設置環境變量?顯式地在上下文中?我想這是有道理的。謝謝b – Angela 2014-12-19 16:11:06

回答

2

您可以

  • 集ENV明確瓦爾的背景下,與ENV["FOO_BAR"] = "baz"
  • 檢查Rails.env.test?在初始化設置twilio和其他客戶提供測試具體選擇採用
  • 有你所有的env設置爲測試一個文件,然後使用dotenv

我個人更喜歡使用ENV只瓦爾創建對象時,再將env var值傳遞給構造函數,所以我可以測試對象類而不關心ENV,並且我可以通過聲明創建使用env var來測試用env var初始化另一個對象的對象。

所以,你會改變一些東西像

class Client 
    def initialize 
    @restclient = RestClient::Resource.new(ENV["API_URL"]) 
    end 
end 

class Client 
    def initialize(url) 
    @restclient = RestClient::Resource.new(url) 
    end 
end 

,並有無論是初始化該實例然後傳遞的環境變量

def fetch_content 
    client = Client.new(ENV["API_URL"]) 
    # ... 
end 

這個值方式你可以測試Client類而不關心env var只是通過一個紐約URL,然後可以測試與更新的環境變量實例化client作爲

it "uses client" do 
    ENV["API_URL"] = "foo.com" 
    expect(Client).to receive(:new).with(ENV["API_URL"]) 
    subject.fetch_content 
end 

一個問題類是改變不散測試套件的休息,如果不這樣做可能會導致問題預計它會在某些測試中出現,在這些情況下,您可以模擬該值

expect(ENV).to receive(:[]).with("API_URL").and_return("foo.com") 
+0

我是否在上下文中設置,如果測試了多個上下文,我需要重複該操作?我不使用Rails,因此#2如何發揮作用?我沒有按照你的最後一段。那是參考#1嗎? – Angela 2014-12-21 20:59:28

+1

你應該在'before(:each)'之前重複設置。注意使用env變量的一個特點是,一旦你在測試中設置它,所有其他測試都將具有該值,這可能是無害的,但如果你看到單獨運行但通過失敗的測試時記住它是很好的當與該套件的其餘部分一起運行時 – rafb3 2014-12-22 17:51:17