最直接的尝试是做
@controller.stubs(:send_file)
但这会导致输出错误,例如
ActionView::MissingTemplate: Missing template ...
那么如何send_file
从 2.3.x 系列中删除该方法。
这个问题与2009 年 2 月在 ruby-forum上提出的问题基本相同,但从未真正得到回答。
贵族
最直接的尝试是做
@controller.stubs(:send_file)
但这会导致输出错误,例如
ActionView::MissingTemplate: Missing template ...
那么如何send_file
从 2.3.x 系列中删除该方法。
这个问题与2009 年 2 月在 ruby-forum上提出的问题基本相同,但从未真正得到回答。
贵族
在 Rails 4(可能更早)[1] 中,ImplicitRender会处理这个问题,并检查“执行?”。
所以,如果你想把它存根,存根“执行?” 应该足够了:
subject.stubs(:performed?).returns(true)
subject.expects(:send_file).
with(image, disposition: "inline")
的实现performed
也不是那么难:
performed?
response_body || (response && response.committed?)
end
因此,在您不想要或不能的情况下,存根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 可以解释的内容,并认为请求已被处理,因为文件已被提供,在这种情况下,不再需要呈现模板。