不可更改的Nokogiri文件



一旦我将一个复杂的HTML文档解析成Nokogiri::HTML对象,我就想将它传递给各个类,从中提取信息。最近我发现一些代码意外地突变了原始对象:

body = Nokogiri::HTML(html_text_from_the_internets)
tables = body.css('table')
tables.each do {|table|
  table.css('br').each do |line_break|
    line_break.replace("n")
  end
end

现在从body 中的所有表中删除所有<br>标签

有没有办法冷冻body使其不发生突变?这样,在测试过程中,希望我能在其他副作用突变破坏东西之前发现它们。调用body.freeze不起作用(可能是因为它只冻结了顶级对象)。

是的,您可以"深度冻结"嵌套对象。

深度冻结本质上是冻结所有子对象的遍历。

如果你愿意,你可以自己写,或者使用ice_nine这样的宝石

另一种不涉及冻结的测试方法是比较前后的整体对象。一个简单的方法是Marshall在之前和之后转储对象,并对它们进行比较。如果转储不同,它们会向您显示发生了什么变化。(类似地,你可以在之前做一个深度克隆,也就是深度dup,并使用它进行比较。同样地,你也可以使用对象哈希。)

相关内容

  • 没有找到相关文章

最新更新