1

我使用Rails 5.我有这个文件,配置/ environment_variables.yml当我运行测试时,如何让Rails加载我的测试环境变量?

development: 
    COINBASE_KEY: devkey 
    COINBASE_SECRET: devsecret 
test: 
    COINBASE_KEY: testkey 
    COINBASE_SECRET: testsecret 
production: 
    COINBASE_KEY: prodkey 
    COINBASE_SECRET: prodsecret 

我与文件加载它,配置/初始化/ environment_variables.rb

module EnvironmentVariables 
    class Application < Rails::Application 
    config.before_configuration do 
     env_file = Rails.root.join("config", 'environment_variables.yml').to_s 

     if File.exists?(env_file) 
     YAML.load_file(env_file)[Rails.env].each do |key, value| 
      ENV[key.to_s] = value 
     end # end YAML.load_file 
     end # end if File.exists? 
    end # end config.before_configuration 
    end # end class 
end # end module 

但是当我运行使用

rails test test/services/crypto_currency_service_test.rb 

测试变量不加载我的测试 - 而那些从开发环境加载。以下是我的测试文件

require 'coinbase/wallet' 
require 'minitest/mock' 

class CryptoCurrencyServiceTest < ActiveSupport::TestCase 

    test 'sell' do 
    last_transaction = MyTransaction.new({ 
     :transaction_type => "buy", 
     :amount_in_usd => "100", 
     :btc_price_in_usd => "3000" 
    }) 

    puts "env: #{ENV['COINBASE_KEY']}" 
    @client = Coinbase::Wallet::Client.new(api_key: ENV['COINBASE_KEY'], api_secret: ENV['COINBASE_SECRET']) 

当我运行测试时,如何获取默认加载的测试变量?

编辑:这里的配置/环境/ test.rb文件,我还没有(有意识地)改变...

Rails.application.configure do 
    # Settings specified here will take precedence over those in config/application.rb. 

    # The test environment is used exclusively to run your application's 
    # test suite. You never need to work with it otherwise. Remember that 
    # your test database is "scratch space" for the test suite and is wiped 
    # and recreated between test runs. Don't rely on the data there! 
    config.cache_classes = true 

    # Do not eager load code on boot. This avoids loading your whole application 
    # just for the purpose of running a single test. If you are using a tool that 
    # preloads Rails for running tests, you may have to set it to true. 
    config.eager_load = false 

    # Configure public file server for tests with Cache-Control for performance. 
    config.public_file_server.enabled = true 
    config.public_file_server.headers = { 
    'Cache-Control' => 'public, max-age=3600' 
    } 

    # Show full error reports and disable caching. 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 

    # Raise exceptions instead of rendering exception templates. 
    config.action_dispatch.show_exceptions = false 

    # Disable request forgery protection in test environment. 
    config.action_controller.allow_forgery_protection = false 
    config.action_mailer.perform_caching = false 

    # Tell Action Mailer not to deliver emails to the real world. 
    # The :test delivery method accumulates sent emails in the 
    # ActionMailer::Base.deliveries array. 
    config.action_mailer.delivery_method = :test 

    # Print deprecation notices to the stderr. 
    config.active_support.deprecation = :stderr 

    # Raises error for missing translations 
    # config.action_view.raise_on_missing_translations = true 
end 
+0

您好,我相信您正在寻找'RAILS_ENV =“test”rails test ...' –

+0

我正在寻找能自动加载环境变量的东西。我不想在每次运行测试时都输入RAILS_ENV =“test”。这看起来非常不合Rails。 – Dave

+0

尝试添加〜/ .profile文件的别名(或您的系统使用的)。沿着 别名rails =“RAILS_ENV ='test'rails” 然后运行source〜/ .profile为当前终端会话激活它。 –

回答

4

我不会为此编写自定义代码。现有的解决方案可用于设置环境变量。例如,请参阅dotenv-rails。它允许你把公共变量放到.env文件中。只需添加gem 'dotenv-rails'Gemfile,把公共变量为.env文件:

# .env 
COINBASE_KEY: devkey 
COINBASE_SECRET: devsecret 

如果您需要特定的环境变量,它可以让你有这个单独的文件:.env.development.env.test.env.production

#.env.test 

COINBASE_KEY: testkey 
COINBASE_SECRET: testsecret 


#.env.production 

COINBASE_KEY: prodkey 
COINBASE_SECRET: prodsecret 
+0

这些“.env”文件位于何处?在我的项目的根源? – Dave

+0

@Dave是的,在你的项目的根源 – Hirurg103

0

从您的原始文章的评论,我建议检查是否config.before_configuration模块没有故障。可能是在该块运行之后加载rails环境的情况,因此当您在测试中打印该内容时获得Rails.env == 'test',但在配置中,它会从默认(开发)环境中获取密钥。

也许我建议把这个部分

env_file = Rails.root.join("config", 'environment_variables.yml').to_s 

     if File.exists?(env_file) 
     YAML.load_file(env_file)[Rails.env].each do |key, value| 
      ENV[key.to_s] = value 
     end # end YAML.load_file 
     end # end if File.exists? 

出一个初始化器,然后检查的环境变量。可能解决这个问题。 (因为初始化一定要尊重环境)

UPDATE:从documentation似乎before_configuration块是第一个块的配置的一部分来运行,所以Rails.env可能尚未确定在这一点上。

+0

我不理解你。你希望我把上面的代码块放在什么位置? – Dave

+0

只需在'/ config/initializers'中创建一个名为'environment_variables.rb'的文件,并将当前拥有的代码块粘贴到'config.before_configuration'中。然后运行测试。正如我所说,该代码块可能在任何环境设置之前运行,但初始化程序肯定会运行。 – Kkulikovskis

相关问题