rspec/capybara: как имитировать входящие POST-запросы? (рэк-тест не сработает)

Мне нужно получать входящие письма в виде составных данных через POST-запрос от Cloudmailin. POST напоминает следующее:

Parameters: {"to"=>"<email@exmaple.comt>", "from"=>"whomever@example", "subject"=>"my awesome subject line....

На самом деле, получать и анализировать электронные письма очень просто, потому что электронное письмо просто публикуется в виде params: params[:to], params[:from] и т. Д. Однако, как мне смоделировать этот запрос POST в рельсах?

Я создал приложение-заглушку для тестирования Cloudmailin, поэтому у меня есть актуальный запрос. Однако это 6-символьный файл, поэтому я хотел бы загрузить этот файл в качестве параметров запроса POST. Я пытался использовать встроенные рельсы post и post_via_redirect для загрузки файла, но он экранирует все параметры ( \"to\"), что не очень хорошо. Есть идеи?

3 ответа

Решение

Итак, я закончил делать:

@parameters = { "x_to_header"=>"<#{ @detail.info }>",
                "to"=>"<#{ @account.slug }@cloudmailin.net>",
                "from"=>"#{ @member.email }",
                "subject"=>"meeting on Monday",
                "plain"=>"here is my message\nand this is a new line\n\n\nand two new lines\n\n\n\nand a third new line"
              }

тогда просто:

post "/where_ever", @parameters

кажется, на данный момент работа сделана

Простой способ, вероятно, выполнить скрипт на капибаре. Просто убедитесь, что с @javascript тег, а затем загрузить любую страницу в вашем приложении, на котором установлен jQuery (технически это вам не нужно, но это гораздо проще. Тогда:

When /^I get a post request from Cloudmailin$/ do
  visit '/some/page/with/jquery'
  page.execute_script(%{$.post("/some/path?to=some_email&etc=etc");})
end

Там простое post Метод капибара тоже, но я не слишком уверен, как это работает. Может быть стоит посмотреть.

Я видел этот ответ вчера вечером, когда обновлял свой собственный тестовый код для Rails 3.2.8, в котором используется гем Mail, и решил поделиться тем, что нашел. Тестовый код предназначен для приложения, которому необходимо взять POST от Cloudmailin, а затем обработать его, чтобы создать нового пользователя с помощью Devise, а затем отправить этому пользователю подтверждение, после чего пользователь может следовать, чтобы выбрать пароль. Вот моя спецификация контроллера:

require 'spec_helper'

describe ThankyouByEmailController do

  message1 = Mail.new do 

    from "Frommy McFromerton <frommy.mcfrommerton@gmail.com>"
    to "toey.receivesalot@gmail.com"
    subject "cloudmailin test"
    body 'something'

    text_part do
      body 'Here is the attachment you wanted'
    end

    html_part do
      content_type 'text/html; charset=UTF-8'
      body '<h1>Funky Title</h1><p>Here is the attachment you wanted</p>'
    end
  end

  describe "creating new users" do

    describe "unregistered FROM sender and Unregistered TO receiver" do

      it "should create 2 new users" do
        lambda do
          post :create, :message => "#{@message1}"
        end.should change(User, :count).by(2)
      end
    end
  end
end

Надеюсь, это очистит ваши собственные тесты. И для всех, кто заинтересован в тестировании почтового драгоценного камня, документация Майкла прошла долгий путь для того же:

https://github.com/mikel/mail

Другие вопросы по тегам