3

最も直接的な試みは

@controller.stubs(:send_file)

しかし、その結果、次のような出力エラーが発生します。

ActionView::MissingTemplate: Missing template ...

send_fileでは、2.3.xシリーズからメソッドをスタブする方法を教えてください。

質問は基本的に2009年2月のルビーフォーラムで尋ねられたものと同じ質問ですが、実際には答えられませんでした。

ジャール

4

3 に答える 3

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 に移動されました。

于 2015-11-30T15:07:15.850 に答える
0

私もこれと戦わなければなりませんでした。私が知る限り、私にとって最良の解決策は次のとおりです。

(コントローラ)

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

私はコードを変更してテストできるようにするのは好きではありませんが、かなり些細な問題の適切な解決策を見つけるために何時間も費やすのは好きではありません:)

于 2012-11-06T18:47:35.647 に答える
0

テンプレートが見つからないというエラーは、(スタブのために) send_file が現在何もしていないことを示している可能性があります。そのため、Rails はレンダリング チェーンをたどってテンプレートを表示しようとします。

これで send_file 呼び出しが効果的に無効になったので、Rails が解釈できるものを実際に送信するようにスタブを変更し、ファイルが提供されたためにリクエストが処理されたと見なす必要があります。この場合、テンプレートをレンダリングする必要はもうありません。

于 2011-08-22T09:57:53.847 に答える