2016-12-31 27 views
1

私のプログラムは、Webからzipファイルをダウンロードして解析します。関連解析関連のコードは次のとおりです。RSpecモック/スタブで異なるパラメータ値を使用する方法は?

私のRSpecのテスト環境では
Zip::File.open("real_file.zip") do |zip_file| 
    # do stuff 
end 

、私が代わりに本物の偽物/モックファイルを解析するために、このコードをスタブにしたいと思います。具体的には、パラメータ値 "real_file.zip"を "mock_file.zip"に置き換えたいと思います。

Iは、次のアプローチを試みた:

allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip")) 

を...が、これは、ブロック(# do stuff)内のコードの実行を防止します。私はモックファイルの内容をに戻したいのですが、その方法ではが返されますが、rahterにはさらに使用するためにzip_fileの値が割り当てられます。これはどのように達成できますか?ここで

+0

{|&ブロック| block.call(Zip :: File.open( 'mock_file.zip'))} ' https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/ブロックインプリメンテーション#発呼者のブロック – mroach

答えて

1

は、あなたが何をしたいです:

mock_file = Zip::File.open('mock_file.zip') 
allow(Zip::File).to receive(:open) { |&block| block.call(mock_file) } 

あなたがここに何をやっている、あなたの元のコードのブロックに値を得ています。スカラー値を返すだけで問題になるのは、ブロックに何も返されないため、呼び出されないということです。 私はメッセージの期待値を入れる前にモックファイルを開いているので、Zip::File.openへの呼び出しも傍受され、素晴らしいスタックオーバーフローが発生する可能性があります。

詳細情報:(:オープン)https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation#yield-to-the-caller私はあなたが `(ジップ::ファイル)を受け取る.TO許可したいと思うのブロック

+0

成功!私はこの戦略を以前に見出しましたが、自分のアプリケーションに合うようにドキュメンテーションの例をどのように翻訳するかを理解できませんでした。ありがとう@mroach – s2t2

関連する問題