最も直接的な試みは
@controller.stubs(:send_file)
しかし、その結果、次のような出力エラーが発生します。
ActionView::MissingTemplate: Missing template ...
send_file
では、2.3.xシリーズからメソッドをスタブする方法を教えてください。
質問は基本的に2009年2月のルビーフォーラムで尋ねられたものと同じ質問ですが、実際には答えられませんでした。
ジャール
最も直接的な試みは
@controller.stubs(:send_file)
しかし、その結果、次のような出力エラーが発生します。
ActionView::MissingTemplate: Missing template ...
send_file
では、2.3.xシリーズからメソッドをスタブする方法を教えてください。
質問は基本的に2009年2月のルビーフォーラムで尋ねられたものと同じ質問ですが、実際には答えられませんでした。
ジャール
Rails 4 (およびおそらくそれ以前)[1] では、ImplicitRenderがこれを処理し、"performed?" に対してチェックします。
それで、あなたがそれをスタブしたいなら、「実行された?」をスタブします。十分なはずです:
subject.stubs(:performed?).returns(true)
subject.expects(:send_file).
with(image, disposition: "inline")
の実装performed
もそれほど難しくありません。
performed?
response_body || (response && response.committed?)
end
そのため、スタブが必要ない、またはできない場合は、が nil でないperformed
ことを確認してください。response_body
[1] 5+ では、これは BasicImplicitRender に移動されました。
私もこれと戦わなければなりませんでした。私が知る限り、私にとって最良の解決策は次のとおりです。
(コントローラ)
def some_action
send_file(some_action_filename)
end
private
def some_action_filename
"/public/something.tgz"
end
(テスト)
test "some_action" do
filename = Rails.root.join("tmp/testfile.tgz")
assert FileUtils.touch filename
@controller.expects(:some_action_filename).at_least_once().returns(filename)
post :some_action
end
私はコードを変更してテストできるようにするのは好きではありませんが、かなり些細な問題の適切な解決策を見つけるために何時間も費やすのは好きではありません:)
テンプレートが見つからないというエラーは、(スタブのために) send_file が現在何もしていないことを示している可能性があります。そのため、Rails はレンダリング チェーンをたどってテンプレートを表示しようとします。
これで send_file 呼び出しが効果的に無効になったので、Rails が解釈できるものを実際に送信するようにスタブを変更し、ファイルが提供されたためにリクエストが処理されたと見なす必要があります。この場合、テンプレートをレンダリングする必要はもうありません。