2014-12-19 92 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