14

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
4

2 に答える 2

34

send_datacsvファイルをダウンロードするコントローラーアクションでテストする必要があり、次の方法でテストしました。

コントローラ:

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
于 2012-10-10T04:23:57.770 に答える
2

助かりました

stub(controller).send_data { controller.render nothing: true }
于 2015-07-23T10:36:58.543 に答える