Я использую 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
Я не могу себе представить, почему класс переменных изменений ,
Что делать, если я не использую метод в классе? Это необходимо? Когда я попробовал это, я получил: «неопределенная локальная переменная или метод« электронная почта »**. Примечание ** Я должен, вероятно, указать, я пытаюсь выполнить BDD в первый раз, поэтому я просто пытаюсь пройти тесты Вот. Я не уверен, буду ли я использовать класс позже или нет, потому что это небольшая небольшая программа, и Mail обрабатывает класс электронной почты довольно удобно. –
В контексте примера «письмо» будет ссылаться на локально определенную переменную. Вы должны определить его с помощью 'let' или присвоить ему значение в примере. Вы * можете * иметь возможность использовать 'subject', если ваш блок' describe' указывает класс, который вы тестируете, например. 'описать MyClass'. Вы не указали нам достаточно кода, чтобы узнать, что здесь происходит. – zetetic