无法模拟Rails 4 Griddler gem测试发布到电子邮件处理器(post params issue)

时间:2015-05-17 09:16:24

标签: ruby-on-rails post griddler

我们有Griddler模​​型测试工作正常。例如我们可以实例化lib / email_processor.rb并进行处理。 我们想要创建一个控制器测试,对标准/ email_processor进行端到端的发布。

问题是params没有通过帖子。我们的基本代码是:

  @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对象是零。

我们已经尝试了

  • @ postattr.to_json#在UTF-8中提供无效的字节序列
  • @ postattr.to_s.to_json#工作,但没有通过
  • 的参数
  • uri编码json字符串

似乎无法正确处理。我们错过了什么?

2 个答案:

答案 0 :(得分:1)

你的params似乎只适用于griddler。但是当你使用griddler-postmark时不正确。 Griddle Postmark适配器接受类似你答案的params,然后是griddler的griddler-postmark预处理参数。在rails app中传递传入电子邮件的params的正确格式如下所示: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

希望这会对你有所帮助:)。

答案 1 :(得分:0)

似乎电子邮件参数的格式化并不那么明显。地址之间实际上是列表。

  @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
                              }]}

希望它可以帮助某人