2013-07-25 61 views
2

我有一個Student模型w/a to_pdf方法,該方法呈現由prawn寶石生成的PDF。測試方法使用Rspec返回PDF數據

class Student < ActiveRecord::Base 
    def to_pdf 
    StudentPdf.new(self.id).render 
    end 
end 

我該如何去爲rspec編寫一個測試來確保此方法返回PDF?

+0

你能告訴StudentPdf的代碼渲染方法是什麼? –

回答

5

任何PDF文檔都以特殊字節序列(稱爲魔術字節或幻數)%PDF(十六進制表示法中的25 50 44 46)開始以標識它們。

require 'prawn' 
Prawn::Document.new.render[0,4] 
# => "%PDF" 

所以,如果你只是想確保返回的字符串是一個PDF文檔,你不關心它的內容,你可以檢查結果魔術字節,例如:

it "must be a PDF" do 
    expect(Student.new.to_pdf[0,4]).to eq('%PDF') 
end 

有關魔法字節herehere

+0

這是一個非常整潔的解決方案! –

+1

爲了擴展到這一點,您可能也想使用它:'expect(response.content_type).to eq('application/pdf')' –

0

嘗試使用那些寶石pdf-readerpdf-inspector檢查呈現的文件,因爲它在對象tests中完成。如果您只想檢查MIME類型的文件,請使用this gem在測試中獲取文件擴展名。

+0

我不需要檢查實際內容(至少目前沒有)。有沒有簡單的方法來檢查MIME類型,而不使用另一個寶石? –

+0

查看下面的答案 –

0

更多的信息,我使用PDF閱讀器的寶石和配方從這裏評論:http://railscasts.com/episodes/153-pdfs-with-prawn-revised?view=comments

這裏是我的代碼: 要求「spec_helper」

describe Report::PerformanceReviewReportPdf do 
    let(:user) { create(:user) } 
    let(:reviews) { create(:reviews) } 
    let(:pdf) { described_class.new(user, [reviews]) } 

    it 'renders pdf correctly' do 
    reader = PDF::Reader.new(StringIO.new(pdf.build)) 
    page = Capybara.string(reader.pages.collect(&:text).join("\n")) 

    page.should have_content('Something') 
    end 
end 

Report::PerformanceReviewReportPdf < Prawn::Document 
    def initialize 
    ...... 
    end 
    def build 
    text 'Something' 
    render 
    end 
end