gpt4 book ai didi

ruby-on-rails - 如何在 RSpec 中测试 send_data?或者……在这种情况下我应该测试什么?

转载 作者:行者123 更新时间:2023-12-03 23:04:24 25 4
gpt4 key购买 nike

使用 RSpec 测试以下代码的最佳方法是什么?我应该测试什么? show 操作打开一个文件并流式传输它。此外,如果该操作依赖于某处存在的文件,我可以对其进行测试吗?

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

最佳答案

我需要测试 send_data在下载 csv 文件的 Controller 操作中,我按照以下方式进行了操作。

Controller :

def index
respond_to do |format|
format.csv do
send_data(Model.generate_csv,
type: 'text/csv; charset=utf-8; header=present',
filename: "report.csv",
disposition: 'attachment')
end
end
end

(rspec 2 解决方案)controller_spec:
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

(rspec 3 解决方案)controller_spec:
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

关于ruby-on-rails - 如何在 RSpec 中测试 send_data?或者……在这种情况下我应该测试什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10357563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com