2017-06-03 21 views
2

私はconfig/environment.rbでLOCAL_SETTINGSと呼ばれる定数を定義しており、これは私のアプリケーション全体で設定と使用に使用しています。 config/local_settings.ymlに保存されているYAMLファイルで、APIキーなどの機密データが含まれることがあります。Rspec - config/environment.rbで定義されている定数をスタブする方法はありますか?

私は現在、LOCAL_SETTINGS["slack"]["slack_token"]を使用する方法の仕様を書いています。

問題は、定数が私の期待通りにスタブされていないことです。つまりexpect(subject.path).to eq(help_request)は、スタブされていないLOCAL_SETTINGSハッシュを含むパスを返すため失敗します。

stub_constの下にデバッガを置き、LOCAL_SETTINGSと入力すると、stub_constが機能していることがわかります。

私の質問は以下のとおりです。

  1. は、私がconfig/environment.rbで定義されている定数のために働いてスタブを取得するためにRSpecの中で行うことができます何かありますか?
  2. この定数は他の場所で単に定義する必要がありますか?もしそうなら、どこ?私はapp/lib /とspec/foldersで自分のアプリケーション全体にアクセスする必要があります。

マイconfig/environment.rbファイル:

# Load the Rails application. 
require_relative 'application' 

LOCAL_SETTINGS = YAML.load_file("#{Rails.root}/config/local_settings.yml") 

# Initialize the Rails application. 
Rails.application.initialize! 

マイスペック:

describe RequestBuilder, type: :model do 
    let(:help_params) { {"user_name"=>"some_user_name", "text"=>"release-bot help"} } 
    let(:help_builder) { RequestBuilder.new(help_params) } 
    let(:help_request) { "/api/files.upload?file=lib%2Fresponses%2Fhelp&filetype=ruby&channels=stubbed_channel&token=stubbed_token" } 
    let(:slack_settings) { {"slack"=>{"slack_token"=>"stubbed_token", "slack_channel"=>"stubbed_channel"}} } 

    context 'Given an incoming request' do 
    context 'With a correctly formatted request' do 
     context 'And the "help" command' do 

     subject { help_builder.build_request_hash } 

     it 'builds a request containing the help data' do 
      stub_const("LOCAL_SETTINGS", slack_settings) 

      expect(subject).to have_key(:request) 
      expect(subject[:request].path).to eq(help_request) 
     end 
     end 
    end 
    end 
end 

答えて

1

あなたがRailsのを使用している、とあなたはすでにconfigディレクトリ内.yamlファイルを持っている場合は、私が見ていることをお勧めRails custom configurationにYAMLファイルをロードします。このようにして、すべてのテストのためにLOCAL_SETTINGS constをスタブしたり、クラスを変更することなく、テスト環境から資格証明を分離することができます。そして、あなたはRails.configuration.local_settings['slack_token']からではなく、LOCAL_SETTINGS定数の値にアクセスすることができ

# config/application.rb 
module MyApp 
    class Application < Rails::Application 
    config.local_settings = config_for(:local_settings) 
    end 
end 

:この設定ファイルをロードする

# config/local_settings.yml 
development: 
    slack_token: some_dev_token 
    slack_channel: some_channel 

test: 
    slack_token: fake_token 
    slack_channel: fake_channel 

production: 
    slack_token: <%= ENV['SLACK_TOKEN'] %> 
    slack_channel: <%= ENV['SLACK_CHANNEL'] %> 

そして。

もう1つはblog post highlighting the custom configurationです。

関連する問題