我使用mail
,nokogiri
和reverse_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
我无法想象为什么变量的类会发生变化。
答案 0 :(得分:2)
您尚未为instance_variable_get
指定接收方,因此默认为self
,此处为RSpec示例组。
您需要email.instance_variable_get(:@body)
(假设您的subject
为email
)。
然而:在测试中使用instance_variable_get
等方法是危险信号。您应该通过其公共接口来测试类,而不是通过检查其内部。