2013-03-07 20 views
8

Pracuję nad aplikacją rails 3.2, z której użytkownicy mogą pobierać pliki pdf. Bardzo lubię rozwój oparty na testach, używając narzędzi rspec i shoulda, ale nie mam z tym nic wspólnego.Testowe pobieranie pdf z rspec i pdfkit

Mam następujący kod w moim kontrolera:

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 

Jest to dość prosty kod, wszystko co robi to konfiguracja mojego PDFKit i pobierz wygenerowany pdf. Teraz chcę przetestować całość, w tym:

  • Przypisanie zmiennych instancji (łatwe, oczywiście, i że działa)
  • wysyłanie danych, czyli świadczenie pdf => I to jest gdzie utknąłem

próbowałem następujące:

controller.should_receive(:send_data) 

ale to daje mi

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

Czy ktoś wie o sposobie sprawdzenia, czy plik PDF jest faktycznie pobrany/wysłany? Co więcej, jak widzisz, powinno być przetestowane pod kątem dobrego pokrycia testowego? Np. Testowanie typu danych, tj. Aplikacji/pdf, byłoby miłe.

Dzięki!

Odpowiedz

15

Nie wiem, dlaczego jesteś coraz to niepowodzenie, ale można zamiast testować nagłówki odpowiedzi:

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

Pytałeś o poradę w sprawie lepszego pokrycia testowego. Pomyślałem, że poleciłbym to: https://www.destroyallsoftware.com/screencasts. Te screencasty miały ogromny wpływ na moją wiedzę na temat rozwoju sterowanego testami - gorąco polecam!

+0

dzięki, ale niestety, że daje mi niezdefiniowana metoda '„response_headers'' - jaka jestem Robię źle? – weltschmerz

+0

Haha, zapomniałem 'dostać: show_as_pdf' :) To rozwiązuje wszystkie problemy. Wielkie dzięki! – weltschmerz

+0

Chciałbym przetestować zawartość pobierania, ale z selenem, który wydaje się nie działać, ktoś wie o tym więcej? –

1

Polecam używanie klejnotu pdf-inspector do pisania specyfikacji dla działań związanych z szyfrem związanych z PDF.

Oto przykładowa specyfikacja (co zakłada szyn #report akcja zapisuje dane o Ticket modelu w wygenerowanym 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

Uwaga: ta specyfikacja powinna być specyfikacją żądania, a nie kontrolerem spec, ten ostatni koduje 'render' z pustym łańcuchem. –

Powiązane problemy