一旦我将一个复杂的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,并使用它进行比较。同样地,你也可以使用对象哈希。)