2015-06-04 35 views
-1

我用mailnokogirireverse_markdown宝石阅读电子邮件和处理机构,剔除外部变量和一个Unicode零宽度字符(u200b)来获取变量@body实例,它是指到一个字符串。下面是相关的代码:instance_variable_get返回零当它是一个空字符串

ReverseMarkdown.convert
@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" 

后,空的电子邮件仍然是三个字符长,可能是由于从空白剔除标签,还是因为降价转换器迫使它有两个空格的空白。这就是为什么我做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 

我无法想象,为什么之类的变量的变化。

回答

2

您还没有指定接收器为instance_variable_get,所以它将默认为self,这里是一个RSpec示例组。

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

但是:在测试中使用诸如instance_variable_get等方法是危险信号。你的目标应该是通过公共接口来测试一个类,而不是通过检查它的内部。

+0

如果我不在课堂上使用该方法怎么办?这是必需的吗?当我尝试这个时,我得到了:'未定义的局部变量或方法'email'' **注意**我应该指定,我第一次尝试BDD,所以我只是想让测试通过这里。我不确定是否稍后会使用课程,因为这是一个小小的程序,Mail很轻松地处理电子邮件课程。 –

+0

在示例的上下文中,“email”将引用本地定义的变量。你需要用'let'来定义它,或者在例子中给它赋值。如果你的'describe'块指定了你正在测试的类,你*可以*使用'subject'。 '描述MyClass'。你没有显示足够的代码让我们知道这里发生了什么。 – zetetic