当instance_variable_get为空字符串时,它返回nil

时间:2015-06-04 21:24:55

标签: ruby instance-variables

我使用mailnokogirireverse_markdown宝石阅读电子邮件并处理正文,删除外部代码和unicode零宽度字符(u200b)获取引用字符串的实例变量@body。这是相关代码:

@body = email.html_part.decoded.delete("\u200b")
@body = Nokogiri::HTML.parse(@body).at("div")
@body.css("br").each { |node| node.replace('<br />') }
@body.css("div").each { |node| node.replace(node.inner_html)}
@body = @body.inner_html
@body = ReverseMarkdown.convert(@body)
if @body.gsub(/\s+/, "").length == 0
  unless email.attachments.length > 0
    raise StandardError, "Empty email"
  end
end
puts @body.class # => "String"

ReverseMarkdown.convert之后,空电子邮件仍然是三个字符长,可能是由于删除标记的空白,或者因为Markdown转换器强制它有一个带有两个空格的空格。这就是我进行gsub长度检查以消除空白区域的原因。

当我运行我的rspec测试时:

context 'with no body' do
  it 'outputs the body to markdown' do
    puts instance_variable_get(:@body).class # => 'NilClass'
    expect(instance_variable_get(:@body)).to eq("")
  end
end

当电子邮件为空并且没有附件时,它会显示:

expected: ""
got: nil

我无法想象为什么变量的类会发生变化。

1 个答案:

答案 0 :(得分:2)

您尚未为instance_variable_get指定接收方,因此默认为self,此处为RSpec示例组。

您需要email.instance_variable_get(:@body)(假设您的subjectemail)。

然而:在测试中使用instance_variable_get等方法是危险信号。您应该通过其公共接口来测试类,而不是通过检查其内部。