Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何存根WickedPdf?

如何存根WickedPdf?
EN

Stack Overflow用户
提问于 2017-12-19 17:14:18
回答 2查看 686关注 0票数 2

我正在使用wicked_pdf gem,目前我正在尝试提高我的规范套件的速度。

我意识到我的一些规范在我的tmp文件夹中生成PDF,这相当耗时。

有没有办法完全截断wicked_pdf的生成,这样它实际上就不会生成PDF了?

EN

回答 2

Stack Overflow用户

发布于 2018-05-22 21:58:22

这取决于您如何使用它,以及您希望在测试套件中删减多少内容,但WickedPdf::PdfHelper#make_pdf可能是一个很好的地方,您可以在RSpec测试中使用如下所示的存根:

代码语言:javascript
运行
AI代码解释
复制
describe MyController do
  describe '#show.pdf' do
    it 'creates a PDF'
      let(:tiny_pdf) do
        # What is the smallest possible valid PDF?
        # https://stackoverflow.com/a/17280876/23915
        "%PDF-1.4\ntrailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>"
      end

      # Here is the actual stubbing
      allow(WickedPdf::PdfHelper).to receive(:make_pdf).and_return tiny_pdf

      get :show, params: { id: 1, format: :pdf }
      expect(response.status).to eq 200
    end
  end
end

或者,您可以通过重新打开类并更改定义来全局覆盖它:

代码语言:javascript
运行
AI代码解释
复制
if Rails.env.test?
  class WickedPdf
    class PdfHelper
      def make_pdf(options = {})
        "%PDF-1.4\ntrailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>"
      end
    end
  end
end
票数 2
EN

Stack Overflow用户

发布于 2020-03-04 09:56:00

就像在另一个答案中一样,清除WickedPdf::PdfHelper#make_pdf会阻止测试用expect(response).to render_template("show")呈现的内容。

为了找出哪些方法会导致写入文件,我在get ... format: :pdf之前临时添加了expect(File).not_to receive(:open),并找到:

代码语言:javascript
运行
AI代码解释
复制
     Failure/Error: render pdf: "...", template: "show"

       (File (class)).open("/tmp/wicked_pdf20200304-24076-r7r1eh.html", 194, {:perm=>384})
           expected: 0 times with any arguments
           received: 1 time with arguments: ("/tmp/wicked_pdf20200304-24076-r7r1eh.html", 194, {:perm=>384})

     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf/tempfile.rb:10:in `initialize'
     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf.rb:58:in `new'
     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf.rb:58:in `pdf_from_string'
     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:91:in `make_pdf'
     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:113:in `make_and_send_pdf'
     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:40:in `render_with_wicked_pdf'
     # /usr/local/bundle/gems/wicked_pdf-1.4.0/lib/wicked_pdf/pdf_helper.rb:30:in `render'
     # ./app/controllers/reports_controller.rb:21:in `block (2 levels) in show'
     # ./app/controllers/reports_controller.rb:11:in `show'

然后,我在这个回溯中的不同位置进行了存根测试,发现下面的代码使测试速度与通常的"html“控制器测试一样快,同时仍然允许测试render_template("show")

代码语言:javascript
运行
AI代码解释
复制
        it "returns http success" do
          allow_any_instance_of(WickedPdf::PdfHelper).to receive(:make_and_send_pdf)
          get :show, params: { id: 1, format: :pdf }
          expect(response).to have_http_status(:success)
        end

        it "renders the show template" do
          allow_any_instance_of(WickedPdf::PdfHelper).to receive(:make_and_send_pdf)
          get :show, params: { id: 1, format: :pdf }
          expect(response).to render_template("show")
        end

这也使得返回极小的pdf成为不必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47892047

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档