2016-05-09 5 views
3

私のコードにENVキーの値の効果をテストしたい。私はこれを使用してスタブしていますルビーのキー/バリューのスタブをENV

allow(ENV).to receive(:[]).with('ADWORDS_RUN').and_return('No') 

これは、別のENVキーにアクセスすることを含むようにターゲットコードを変更するまで機能していました。ターゲットコードは現在、以下の

def not_local_machine? 
    !ENV['LOCAL_MACHINE'] 
end 

テストを含むエラーメッセージ

Failure/Error: get 'home' 
    ENV received :[] with unexpected arguments 
    expected: ("ADWORDS_RUN") 
      got: ("LOCAL_MACHINE") 
    Please stub a default value first if message might be received with other args as well. 

スタブの私の現在の方法は、他のENVキーを一掃されたことが表示されますと上記の機能に障害が発生しました。この問題を回避するには、どのようにENVキーをスタブしますか?

答えて

4

を使用でき

stub_const 'ENV', ENV.to_h.merge('ADWORDS_RUN' => 'No') 
+0

これを試して、 '' 'ENV'''に' '合併' 'が定義されていないというエラーを受けました。 '' 'ENV'''のクラスはオブジェクトです。これは正しい答え、マージを実装する方法のアイデアに近いですか? – Obromios

+0

@Obromios、マージの前に 'ENV'の後に' .to_h'を追加してハッシュに変換しました。それはうまくいくはずです。 – Mori

+0

閉じる、変更する必要があります:ENVを 'ENV'に設定する方法については、https://www.relishapp.com/rspec/rspec-mocks/v/2-11/docs/stubbing-constants/stub-defined-constantを参照してください。私はそれに応じてあなたの答えを編集し、編集が受け入れられれば、あなたの答えを受け入れます。 – Obromios

0

ENVの[]メソッドを上書き/上書きしています。元の意味は完全に消えてしまった。

https://github.com/rspec/rspec-mocksをチェックし、「任意の取り扱い」の章をご覧ください。これは、このサンプル・コードが含まれています。

expect(double).to receive(:msg) do |arg| 
    expect(arg.size).to eq 7 
end 

あなたは...あなたのニーズに合わせて(未テスト)の線に沿って何かをそれを採用することができるはず

dummy_env = { ADWORDS_RUN: 1, LOCAL_MACHINE: 2 } 
allow(ENV).to receive(:[]) do |key| 
    dummy_env[key] or raise "#{key} not expected" 
end 

それとも、すべての古いENVを維持したい場合エントリー

env_clone = ENV.clone 
allow... do|key| 
    dummy_env[key] or env_clone[key] 
end 
+0

これを試してもうまくいきませんでしたが、キーのスタブされた値の代わりにnilを返します。 api http://ruby-doc.org/core-2.0.0/ENV.htmlを見ると、 '' 'key''メソッドはキーの値を返さないので、おそらくこのアプローチは別の受信機ですか? – Obromios

+0

はい、申し訳ありませんが、私は答えを修正しました。私は 'receive(:key)'の代わりに 'receive(:[])'を意味しました。 – AnoE

+0

これを試してみると、 '' 'Failure/Error:dummy_env [key]またはENV [key] SystemStackError: スタックレベルが深すぎます' 'というエラーが表示されます。 – Obromios

関連する問題