Тестовая загрузка pdf с помощью rspec и pdfkit
Я разрабатываю приложение rails 3.2, с помощью которого пользователи могут загружать PDF-файлы. Мне нравится тестовая разработка с использованием rspec и shoulda matchers, но я в недоумении с этим.
у меня есть следующий код в мой контроллер:
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
Это довольно простой код, все, что он делает, это настроить мой PDFKit и загрузить сгенерированный pdf. Теперь я хочу проверить все это, в том числе:
- назначение переменных экземпляра (легко, из конечно, и это работает)
- отправка данных, то есть рендеринг pdf => и вот где я застрял
я попробовал следующее:
controller.should_receive(:send_data)
но это дает мне
Failure/Error: controller.should_receive(:send_data)
(#<InvoicesController:0x007fd96fa3e580>).send_data(any args)
expected: 1 time
received: 0 times
кто-нибудь знает способ проверить, что pdf фактически загружен/отправлен? Кроме того, какие еще вещи вы видите, которые должны быть проверены на хорошее покрытие теста? Например, тестирование типа данных, т. е. application / pdf, будет милый.
спасибо!
2 ответов
Не уверен, почему вы получаете этот сбой, но вместо этого вы можете проверить заголовки ответов:
response_headers["Content-Type"].should == "application/pdf"
response_headers["Content-Disposition"].should == "attachment; filename=\"<invoice_name>.pdf\""
вы попросили совета относительно лучшего покрытия теста. Я подумал, что рекомендую это:https://www.destroyallsoftware.com/screencasts. Эти скринкасты оказали огромное влияние на мое понимание тестовой разработки-настоятельно рекомендуется!
Я рекомендую использовать pdf-инспектор gem для написания спецификаций для связанных с PDF действий Rails.
вот примерная спецификация (которая предполагает Rails #report
действие записывает данные о Ticket
модель в сгенерированном 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