2015-06-04 60 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