我有一個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?
我有一個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?
任何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
這是一個非常整潔的解決方案! –
爲了擴展到這一點,您可能也想使用它:'expect(response.content_type).to eq('application/pdf')' –
嘗試使用那些寶石pdf-reader或pdf-inspector檢查呈現的文件,因爲它在對象tests中完成。如果您只想檢查MIME類型的文件,請使用this gem在測試中獲取文件擴展名。
我不需要檢查實際內容(至少目前沒有)。有沒有簡單的方法來檢查MIME類型,而不使用另一個寶石? –
查看下面的答案 –
更多的信息,我使用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
你能告訴StudentPdf的代碼渲染方法是什麼? –