【问题标题】:How to Test/Debug Jekyll Plugins?如何测试/调试 Jekyll 插件?
【发布时间】:2022-01-24 09:26:19
【问题描述】:

对于博客,我放置了一个内联标签,用于从指定网页中提取标题信息。它可以工作,但我需要添加缓存,这样我就不会进行多余的网络调用。

我想要一个比重新启动服务器并等待重建更紧凑的调试周期,但运行插件作为 Ruby 代码报告 uninitialized constant Liquid (NameError)。这是有道理的,因为它不是required,并且不会运行,因为插件只是一个类定义。

所以,我尝试创建一些脚手架来运行代码,或者无论如何我认为应该是脚手架。

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() 来创建对象,我合并了前两行代码,但这也不起作用。相同的错误,不同的函数名称。该插件不会将任何东西标记为private,并且声明方法public 不会改变任何东西。

在不携带整个博客的情况下测试插件还需要什么?

【问题讨论】:

    标签: ruby testing jekyll jekyll-extensions


    【解决方案1】:

    解决方案超出了我的 Ruby 知识范围,一旦我连接了四处飘荡的信息片段,大部分情况就很简单了。

    首先,this existing answer 是关于处理 Rails 的特定问题,但顺便说明了如何处理私有new 方法:通过send 调用它们,如HeaderInlineTag.send :new

    然后,这个对.new() 的间接调用现在(当然)调用.initialize(),这意味着它需要任何插件都需要的三个参数。两个参数用于测试本身,所以它们很容易。第三个是解析上下文。关于编写 Jekyll 插件的文档永远不会清楚解析上下文实际上是什么,因为它是作为构建过程的一部分自动发送的。然而,一些研究和测试发现Liquid::ParseContext 是罪魁祸首。

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

    因此,测试支架应该看起来像这样。

    require 'liquid'
    require_relative '../_plugins/header.rb'
    
    context = Liquid::ParseContext.new
    ht = HeaderInlineTag.send :new, 'header', 'some path...', context
    puts ht.render context
    

    我可以使用ruby _test/header.rb 从我的博客的根文件夹调用它,它会打印插件的输出。我现在可以更新此脚本以从命令行或 CSV 文件中提取参数,具体取决于所需的测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 2013-10-06
      • 2012-08-07
      • 1970-01-01
      • 2013-01-10
      • 2019-08-05
      • 2017-06-10
      相关资源
      最近更新 更多