2013-03-07 8 views
8

Ich entwickle eine Rails 3.2-Anwendung, mit der Benutzer pdfs herunterladen können. Ich genieße die testgetriebene Entwicklung sehr, wenn ich rspec und shofa Matcher benutze, aber ich bin ratlos.Test-Download von pdf mit rspec und pdfkit

Ich habe den folgenden Code in meinem Controller:

def show_as_pdf 
    @client = Client.find(params[:client_id]) 
    @invoice = @client.invoices.find(params[:id]) 

    PDFKit.configure do |config| 
    config.default_options = { 
     :footer_font_size => "6", 
     :encoding => "UTF-8", 
     :margin_top=>"1in", 
     :margin_right=>"1in", 
     :margin_bottom=>"1in", 
     :margin_left=>"1in" 
    } 
    end 

    pdf = PDFKit.new(render_to_string "invoices/pdf", layout: false) 
    invoice_stylesheet_path = File.expand_path(File.dirname(__FILE__) + "/../assets/stylesheets/pdfs/invoices.css.scss") 
    bootstrap_path = File.expand_path(File.dirname(__FILE__) + "../../../vendor/assets/stylesheets/bootstrap.min.css") 

    pdf.stylesheets << invoice_stylesheet_path 
    pdf.stylesheets << bootstrap_path 
    send_data pdf.to_pdf, filename: "#{@invoice.created_at.strftime("%Y-%m-%d")}_#{@client.name.gsub(" ", "_")}_#{@client.company.gsub(" ", "_")}_#{@invoice.number.gsub(" ", "_")}", type: "application/pdf" 
    return true 
end 

Dies ist eine ziemlich einfache Code, alle es tut, ist mein PDFKit konfigurieren und das erzeugte PDF herunterladen. Jetzt möchte ich das Ganze testen, einschließlich:

  • Zuordnung der Instanzvariablen (leicht, natürlich, und das funktioniert)
  • Das Senden von Daten, dh die Wiedergabe des pdf => Und das ist wo ich bin fest

ich folgendes versucht:

controller.should_receive(:send_data) 

aber das gibt mir

Failure/Error: controller.should_receive(:send_data) 
    (#<InvoicesController:0x007fd96fa3e580>).send_data(any args) 
     expected: 1 time 
     received: 0 times 

Kennt jemand eine Möglichkeit zu testen, dass das PDF tatsächlich heruntergeladen/gesendet wird? Welche weiteren Dinge sehen Sie, die auf eine gute Testabdeckung getestet werden sollten? Z. B. wäre das Testen auf den Datentyp, d. H. Anwendung/pdf, nett.

Danke!

Antwort

15

nicht sicher, warum Sie, dass ein Scheitern sind immer, aber man könnte die Antwort-Header statt testen:

response_headers["Content-Type"].should == "application/pdf" 
response_headers["Content-Disposition"].should == "attachment; filename=\"<invoice_name>.pdf\"" 

Sie baten um Rat in Bezug auf eine bessere Testabdeckung. Ich dachte, ich würde das empfehlen: https://www.destroyallsoftware.com/screencasts. Diese Screencasts hatten einen großen Einfluss auf mein Verständnis der testgetriebenen Entwicklung - sehr empfehlenswert!

+0

Danke, aber leider das gibt mir 'nicht definierte Methode‚response_headers'' - was am Ich mache falsch? – weltschmerz

+0

Haha, ich habe vergessen zu bekommen: show_as_pdf :) Das löst alle Probleme. Danke vielmals! – weltschmerz

+0

Ich möchte den Download-Inhalt testen, aber mit Selen, das scheint nicht zu funktionieren, weiß jemand mehr darüber? –

1

Ich empfehle die Verwendung der pdf-inspector Edelstein zum Schreiben von Spezifikationen für PDF-bezogene Rails Aktionen.

Hier ist ein beispielhaftes spec (die die Rails übernimmt #report Aktion schreibt Daten über ein Ticket Modell in der generierten PDF):

describe 'GET /report.pdf' do 
    it 'returns downloadable PDF with the ticket' do 
    ticket = FactoryGirl.create :ticket 

    get report_path, format: :pdf 

    expect(response).to be_successful 

    analysis = PDF::Inspector::Text.analyze response.body 

    expect(analysis.strings).to include ticket.state 
    expect(analysis.strings).to include ticket.title 
    end 
end 
+0

Hinweis: Diese Spezifikation sollte eine Anforderungsspezifikation sein, nicht Controller-Spezifikation, die letztere Stubs 'render' mit einer leeren Zeichenfolge. –

Verwandte Themen