如何存根 WickedPdf?

Posted

技术标签:

【中文标题】如何存根 WickedPdf?【英文标题】:How to stub WickedPdf? 【发布时间】:2018-06-02 04:30:48 【问题描述】:

我正在使用 wicked_pdf gem,目前正在尝试加快我的规范套件。

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

有没有办法完全存根 wicked_pdf 生成,所以它实际上不会生成 PDF?

【问题讨论】:

【参考方案1】:

这取决于您如何使用它,以及您希望在测试套件期间削减多少,但可能一个好地方是WickedPdf::PdfHelper#make_pdf,您可以在 RSpec 测试中使用类似这样的东西存根:

describe MyController do
  describe '#show.pdf' do
    it 'creates a PDF'
      let(:tiny_pdf) do
        # What is the smallest possible valid PDF?
        # https://***.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

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

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

【讨论】:

如果这可以帮助我在使用 allow(...) 时遇到错误,但可以通过以下方式修复它:allow_any_instance_of(WickedPdf::PdfHelper).to receive(:make_pdf).and_return tiny_pdf 【参考方案2】:

在另一个答案中剔除 WickedPdf::PdfHelper#make_pdf 可以防止测试正在渲染的内容,例如expect(response).to render_template("show").

为了查找导致写入文件的方法,我在get ... format: :pdf 之前临时添加了expect(File).not_to receive(:open) 并发现:

     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")

        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 变得不必要。

【讨论】:

以上是关于如何存根 WickedPdf?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cy.intercept() 使用不同的存根存根两个请求?

如何使用 sinon 存根 new Date()?

如何在 UITesting 上存根网络请求

如何在 WebStorm 编辑器中生成代码存根

如何使用 Jest 和 Proxyquire 存根模块?

如何获取“matplotlib”、“numpy”、“scipy”、“pandas”等的存根文件?