Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行rspec for ruby时,如何更改环境变量?_Ruby_Rspec_Environment Variables - Fatal编程技术网

在运行rspec for ruby时,如何更改环境变量?

在运行rspec for ruby时,如何更改环境变量?,ruby,rspec,environment-variables,Ruby,Rspec,Environment Variables,我有几个ruby脚本,并用rspec测试它们 我将我的环境放在一个env.rb文件中(目前),这样我就可以在本地访问它们,并在生产环境中将它们放在配置变量中 但是当我运行rspec时,我想要不同的环境变量。两个用例: 我运行Twilio,因此我希望能够更改用于测试凭据的SID 我将事物作为服务存储在数据库中,并希望有一个单独的测试数据库 你可以 使用ENV[“FOO_BAR”]=“baz” 检查初始化器中的Rails.env.test?,以使用特定于测试的选项设置twilio和其他客户端 有

我有几个ruby脚本,并用rspec测试它们

我将我的环境放在一个env.rb文件中(目前),这样我就可以在本地访问它们,并在生产环境中将它们放在配置变量中

但是当我运行rspec时,我想要不同的环境变量。两个用例:

  • 我运行Twilio,因此我希望能够更改用于测试凭据的SID
  • 我将事物作为服务存储在数据库中,并希望有一个单独的测试数据库
    • 你可以

      • 使用
        ENV[“FOO_BAR”]=“baz”
      • 检查初始化器中的
        Rails.env.test?
        ,以使用特定于测试的选项设置twilio和其他客户端
      • 有一个包含所有环境设置的文件用于测试,然后使用
      我个人更喜欢仅在创建对象并将ENV-var值传递给构造函数时使用ENV-var,因此我可以测试对象类而不必关心ENV,并且我可以通过断言使用ENV-var创建的对象来测试使用ENV-var初始化另一个对象的对象

      所以你会改变一些事情,比如

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

      并让初始化该实例的任何东西传递env var的值

      def fetch_content
        client = Client.new(ENV["API_URL"])
        # ...
      end
      
      通过这种方式,您可以通过只传递任何url来测试
      客户机
      类,而不必关心环境变量,然后可以测试实例化
      客户机
      的类

      it "uses client" do
        ENV["API_URL"] = "foo.com"
        expect(Client).to receive(:new).with(ENV["API_URL"])  
        subject.fetch_content
      end
      
      更新env var的一个问题是,更改会在测试套件的其余部分持续存在,如果您不希望它出现在某些测试中,则可能会导致问题,在这些情况下,您可以使用

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

      您应该只在测试套件中使用环境变量。因此,使用其他凭据而不是生产凭据初始化Twillio客户端。如何在测试套件中设置环境变量?明确地在上下文中?我想这是有道理的。谢谢,我在上下文中设置,如果在多个上下文中测试,我需要重复吗?我不使用Rails,那么#2怎么玩呢?我没有听懂你的最后一段。这是参考#1吗?理想情况下,您应该在(:each)之前在
      中重复设置。请注意,使用env vars的一个特点是,一旦您在测试中设置了它,所有其他测试都将具有该值,这可能是无害的,但如果您看到测试在单独运行时通过,但在与其他suitee一起运行时失败,请记住这一点,即使您说过不要使用到env的直接绑定,我很喜欢。谢谢分享
      
      expect(ENV).to receive(:[]).with("API_URL").and_return("foo.com")