2015-06-04 3 views
-1

Я использую mail, nokogiri и reverse_markdown драгоценные камни, чтобы прочитать электронную почту и обработать тело, зачистки внешних тегов и юникода нулевой ширины символа (u200b), чтобы получить экземпляр переменной @body, ссылающийся к строке. Вот соответствующий код:instance_variable_get возвращает ноль, если это пустая строка

@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 

Я не могу себе представить, почему класс переменных изменений ,

ответ

2

Вы не указали ресивер для instance_variable_get, поэтому он будет по умолчанию равен self, который представляет собой группу примеров RSpec.

Вам понадобится email.instance_variable_get(:@body) (предполагается, что ваш subject - email).

Однако: использование методов, таких как instance_variable_get в тесте, является сигналом опасности. Вы должны стремиться тестировать класс своим публичным интерфейсом, а не изучать его внутренности.

+0

Что делать, если я не использую метод в классе? Это необходимо? Когда я попробовал это, я получил: «неопределенная локальная переменная или метод« электронная почта »**. Примечание ** Я должен, вероятно, указать, я пытаюсь выполнить BDD в первый раз, поэтому я просто пытаюсь пройти тесты Вот. Я не уверен, буду ли я использовать класс позже или нет, потому что это небольшая небольшая программа, и Mail обрабатывает класс электронной почты довольно удобно. –

+0

В контексте примера «письмо» будет ссылаться на локально определенную переменную. Вы должны определить его с помощью 'let' или присвоить ему значение в примере. Вы * можете * иметь возможность использовать 'subject', если ваш блок' describe' указывает класс, который вы тестируете, например. 'описать MyClass'. Вы не указали нам достаточно кода, чтобы узнать, что здесь происходит. – zetetic

Смежные вопросы