Настройка page/respone.body в Capybara раньше работала в Webrat

Я перехожу на Capybara. Одна из проблем, с которыми я столкнулся, — это перенос шага pdf.

Этот шаг устанавливает page.body в проанализированный PDF-файл. Таким образом, я могу использовать шаги огурца по умолчанию.

When 'I follow the PDF link "$label"' do |label|
  click_link(label)
  page.body = PDF::Inspector::Text.analyze(page.body).strings.join(" ")
end

Ex.

When I follow the PDF link "Catalogue"
Then I should see "Cheap products"

Ошибка, которую я получаю, это:

undefined method `body=' for #<Capybara::`enter code here`Document> (NoMethodError)

person Tom Maeckelberghe    schedule 08.03.2011    source источник


Ответы (3)


В исходном коде в капибаре нет сеттера для тела, поэтому вы не можете установить его таким образом. Попробуйте это (не проверено):

page.instance_variable_set(:@body, PDF::Inspector::Text.analyze(page.body).strings.join(" "))
person ebeland    schedule 09.03.2011
comment
Ваш ответ не сработал, но он привел меня в правильном направлении. Я заменил «страницу» на «page.driver», и это сработало. Спасибо ! - person Tom Maeckelberghe; 09.03.2011

Кроме того, убедитесь, что вы установили :js => true следующим образом:

scenario 'do something', :js => true do
    str = PDF::Inspector::Text.analyze(page.body).strings.join(" ") # or whatever string you want
    # then just use javascript to edit or add the body
    page.evaluate_script("document.write(#{str});")
end

Теперь это зависит от драйвера, но это одно из решений...

person bentael    schedule 27.03.2012
comment
я знаю, что это мой первый ответ на SO, но я долго скрывался. ваше здоровье - person bentael; 28.03.2012

Это сработало для меня:

Then /^I should be served the document as a PDF$/ do
  page.response_headers['Content-Type'].should == "application/pdf"
  pdf = PDF::Inspector::Text.analyze(page.source).strings.join(" ")
  page.driver.response.instance_variable_set('@body', pdf)
end

Then /^I should see the document details$/ do
  page.should have_content("#{@document.customer.name}")
  page.should have_content("#{@document.resources.first.resource.name}")
  page.should have_content("Document opened at #{@document.created_at.strftime("%e-%b-%4Y %r")}")
end

Обратите внимание, что я отправляю свой PDF-файл в режиме онлайн

pdf = DocumentPdf.new(@document)
send_data pdf.render, :filename => "document_#{@document.created_at.strftime("%Y-%m-%d")}",
  :type => "application/pdf",
  :disposition => "inline"
person Chris Bloom    schedule 28.02.2012