Невозможно смоделировать отправку тестового гема Rails 4 Griddler в обработчик электронной почты (проблема post params)
У нас тесты Griddler Model работают нормально. Например, мы можем создать экземпляр lib/email_processor.rb, и он будет обрабатываться. Мы хотим создать тест контроллера, который выполняет сквозную запись в стандартном / email_processor.
Проблема в том, что параметры не приходят через почту. наш основной код:
@postattr= {to: "hello@hello.com", subject: "a subject", attachments: [
ActionDispatch::Http::UploadedFile.new({
filename: 'example_virgin_onetransaction.pdf',
type: 'application/pdf',
tempfile: File.new('testfiles/examplefile.pdf")})
]}
post :create, @postattr
expect(response).to be_success
он работает при отправке сообщений на правильный маршрут и обрабатывается, за исключением того, что объект email.attachments равен nil.
мы пытались
- @postattr.to_json # дает неверную последовательность байтов в UTF-8
- @ postattr.to_s.to_json # работает, но параметры не передаются
- URI, кодирующий строку JSON
кажется, что ничего не обрабатывается правильно. что мы пропустили?
2 ответа
Ваши параметры кажутся подходящими для использования только griddler. Но неверно, когда вы используете griddler-postmark. Griddle Postmark адаптер принимает параметры, такие как ваш ответ, затем griddler-postmark предварительно обрабатывает параметры для griddler. Правильный формат для передачи параметров для входящей электронной почты в приложении rails следующий: griddler-postmark
attributes = {Subject: "a subject", TextBody: "Hello!",
ToFull: [{Email: 'to_email@email.com', Name: 'to email'}],
FromFull: {Email: "from_email@email.com", Name: "from email"},
Attachments: [{Name: 'filename.pdf',
Content: Base64.encode64(fixture_file.read),
ContentType: 'application/pdf',
ContentLength: fixture_file.size
}]}
post :create, attributes
Вы можете получить проблемы с обработкой входящей электронной почты с вложением. Таким образом я добавляю пример класса EmailProcessor следующим образом
class EmailProcessor
def initialize(email)
@email = email
end
def process
if @email.attachments.present?
attachment = @email.attachments.first
file = File.new(attachment.original_filename, 'wb')
file.write attachment.read
file.flush
attached_document = AttachedDocument.new(paper: file)
attached_document.save!
end
end
end
Жаль, что это поможет вам:)
Правильно, похоже, что форматирование параметров электронной почты не так очевидно. и от адресов на самом деле списки.
@post_attr = {Subject: "a subject", TextBody: "Hello!",
ToFull: [{Email: 'to_email@email.com', Name: 'to email'}],
FromFull: {Email: "from_email@email.com", Name: "from email"},
Attachments: [{Name: 'filename.pdf',
Content: Base64.encode64(fixture_file.read),
ContentType: 'application/pdf',
ContentLength: fixture_file.size
}]}
надеюсь, это поможет кому-то