簡體   English   中英

如何測試/調試 Jekyll 插件?

[英]How to Test/Debug Jekyll Plugins?

對於博客,我整理了一個內聯標簽,該標簽從指定網頁中提取 header 信息。 它可以工作,但我需要添加緩存,這樣我就不會進行冗余的網絡調用。

我想要一個比重新啟動服務器並等待重建更緊湊的調試周期,但是運行插件作為 Ruby 代碼報告uninitialized constant Liquid (NameError) 這是有道理的,因為它require d,也不會運行,因為插件只是 class 定義。

所以,我嘗試創建一些腳手架來運行代碼,或者我認為的腳手架,無論如何。

require 'liquid'
require_relative '../_plugins/header.rb'

ht = HeaderInlineTag.new
ht.initialize 'header', 'some path'
puts ht.render()

這產生...

_test/header.rb:4:in `<main>': private method `new' called for HeaderInlineTag:Class (NoMethodError)

考慮到可能會運行initialize()來創建對象,我合並了前兩行代碼,但這也不起作用。 同樣的錯誤,不同的 function 名稱。 該插件不會將任何東西標記為private ,並且將方法聲明為public不會改變任何東西。

在不攜帶整個博客的情況下測試插件還需要什么?

解決方案超出了我對 Ruby 的了解,大多數情況下都很簡單,一旦我連接了四處飄盪的信息。

首先,這個現有答案是關於處理 Rails 的特定問題,但順便顯示了如何處理私有new方法:通過send調用它們,如HeaderInlineTag.send:new

然后,這個對.new()的間接調用現在(當然)調用.initialize() ,這意味着它需要任何插件所需的三個參數。 兩個參數用於測試本身,所以它們很容易。 第三個是解析上下文。 關於編寫 Jekyll 插件的文檔永遠不會清楚解析上下文實際上是什么,因為它是作為構建過程的一部分自動發送的。 然而,一些研究和測試發現Liquid::ParseContext是罪魁禍首。

最后, .render .render()也采用ParseContext值。

因此,測試腳手架應該看起來像這樣。

require 'liquid'
require_relative '../_plugins/header.rb'

context = Liquid::ParseContext.new
ht = GithubInlineTag.send :new, 'header', 'some path...', context
puts ht.render context

我可以使用ruby -rliquid _test/header.rb從我博客的根文件夾中調用它,它會打印結果。 我現在可以更新此腳本以從命令行或 CSV 文件中提取參數,具體取決於所需的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM