Ruby on rails 如何在RSpec中测试发送_数据?或者…在这种情况下,我应该测试什么?
使用RSpec测试以下代码的最佳方法是什么?我应该测试什么呢?“显示”操作打开一个文件并对其进行流式处理。另外,如果操作依赖于某个地方存在的文件,我可以测试它吗Ruby on rails 如何在RSpec中测试发送_数据?或者…在这种情况下,我应该测试什么?,ruby-on-rails,rspec,Ruby On Rails,Rspec,使用RSpec测试以下代码的最佳方法是什么?我应该测试什么呢?“显示”操作打开一个文件并对其进行流式处理。另外,如果操作依赖于某个地方存在的文件,我可以测试它吗 def show image_option = params[:image_option] respond_to do |format| format.js format.pdf {open_bmap_file("#{@bmap.bmap_pdf_file}", 'application/pdf', "#{@bm
def show
image_option = params[:image_option]
respond_to do |format|
format.js
format.pdf {open_bmap_file("#{@bmap.bmap_pdf_file}", 'application/pdf', "#{@bmap.bmap_name}.pdf", "pdf", "pdf")}
format.png {open_bmap_file("#{@bmap.bmap_png_file}", 'image/png', "#{@bmap.bmap_name}.png", "png", image_option)}
end
end
private
def open_bmap_file(filename, application_type, send_filename, format, image_option = nil)
filename = "app/assets/images/image_not_available_small.png" unless File.exist? filename
path = Bmap.bmaps_pngs_path
case image_option
when "image"
filename = "#{@bmap.bmap_name}.png"
when "large_thumbnail"
filename = "#{@bmap.bmap_name}_large_thumb.png"
when "thumbnail"
filename = "#{@bmap.bmap_name}_thumb.png"
when "pdf"
filename = "#{@bmap.bmap_name}.pdf"
path = Bmap.bmaps_pdfs_path
else
filename = "#{@bmap.bmap_name}.pdf"
path = Bmap.bmaps_pdfs_path
end
begin
File.open(path + filename, 'rb') do |f|
send_data f.read, :disposition => image_option == "pdf" ? 'attachment' : 'inline', :type => application_type, :filename => send_filename
end
rescue
flash[:error] = 'File not found.'
redirect_to root_url
end
我需要在下载csv文件的控制器操作中测试
send_data
控制器:
(rspec 2解决方案)控制器规格:
(rspec 3解决方案)控制器规格:
这对我有帮助
stub(controller).send_data { controller.render nothing: true }
这是一个很好的解决方案,但似乎不适用于Rspec 3Jonathon Horsman-我添加了一个Rspec 3解决方案,语法略有不同我不建议这样做。模拟您不拥有的代码通常不是一个好主意-除其他外,在原始OOPSLA模拟文件中明确警告不要这样做。如果
send_data
的API发生了更改(例如,Rails升级),您将不知道您的代码已损坏。@XavierShay那么我们应该如何测试这种情况?你能分享一下你的想法或你所知道的代码吗?对我来说,它不能够呈现nothing:true,它仍然抛出一个“Missing template”
错误。我通过调用原始代码解决了这个问题:expect(@controller.)。接收(:发送数据)。使用(csv\u字符串,csv\u选项)。以及调用原始代码。这感觉不像是一个干净的解决方案,但我不认为在控制器规范中实际发送带有文件名的响应有任何伤害
context "when format is csv" do
let(:csv_string) { Model.generate_csv }
let(:csv_options) { {filename: "report.csv", disposition: 'attachment', type: 'text/csv; charset=utf-8; header=present'} }
it "should return a csv attachment" do
@controller.should_receive(:send_data).with(csv_string, csv_options).
and_return { @controller.render nothing: true } # to prevent a 'missing template' error
get :index, format: :csv
end
end
context "when format is csv" do
let(:csv_string) { Model.generate_csv }
let(:csv_options) { {filename: "report.csv", disposition: 'attachment', type: 'text/csv; charset=utf-8; header=present'} }
it "should return a csv attachment" do
expect(@controller).to receive(:send_data).with(csv_string, csv_options) {
@controller.render nothing: true # to prevent a 'missing template' error
}
get :index, format: :csv
end
end
stub(controller).send_data { controller.render nothing: true }