我有幾個ruby腳本,並用rspec測試它們。如何在運行rspec for ruby時更改環境變量?
我把我的環境放在一個env.rb文件(現在),所以我可以在本地訪問它們,並在生產環境中將它們放入配置變量中。
但是當我運行rspec時,我想要不同的環境變量。兩個用例:
- 我跑Twilio,所以我希望能夠更改用於他們的測試憑據
- 我存儲的東西在數據庫作爲服務的SID,並希望有一個獨立的測試數據庫
我有幾個ruby腳本,並用rspec測試它們。如何在運行rspec for ruby時更改環境變量?
我把我的環境放在一個env.rb文件(現在),所以我可以在本地訪問它們,並在生產環境中將它們放入配置變量中。
但是當我運行rspec時,我想要不同的環境變量。兩個用例:
您可以
ENV["FOO_BAR"] = "baz"
Rails.env.test?
在初始化設置twilio和其他客戶提供測試具體選擇採用我個人更喜歡使用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")
您應該在測試套件中使用環境變量。所以用你的其他憑證而不是生產憑證初始化Twillio客戶端。 – Anthony 2014-12-19 13:01:03
如何在測試套件中設置環境變量?顯式地在上下文中?我想這是有道理的。謝謝b – Angela 2014-12-19 16:11:06