2011-08-22 155 views
4

我需要通过来自Cloudmailin的POST请求接收传入的电子邮件,作为multipart-formdata。该POST类似于以下内容:rspec/capybara:如何模拟传入的POST请求? (机架测试不起作用)

Parameters: {"to"=>"<[email protected]>", "from"=>"[email protected]", "subject"=>"my awesome subject line.... 

其实,接收并解析邮件是超级容易,因为邮件仅仅是张贴PARAMS:PARAMS [:对],则params [:从]等。但是,我该怎么办在rails中模拟这个POST请求?

我构建了一个虚拟导轨应用程序来测试Cloudmailin,所以我有一个实际的请求。但是,这是一个6k字符的文件,所以我想将这个文件作为POST请求的参数加载。我尝试过使用构建的rails post和post_via_redirect方法来加载文件,但它将所有参数(\“转换为\”)转义,这是不好的。有任何想法吗?

+0

http://railscasts.com/episodes/276-testing-time-web-requests特别https://github.com/chrisk/fakeweb – rubish

+0

谢谢你的评论。我相信fakeweb是为了测试从外部API获取。我需要测试传入的请求。其实,这不是事实。我只需要向控制器发布一些参数,其余的测试将确保创建适当的邮件。 – GoodGets

+0

对不起,大概我应该睡了:) – rubish

回答

12

所以,我落得这样做:。

@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 

似乎把工作现在

+0

听起来像一个整洁但简单的想法 – Vatsala

+0

这将与其他功能(例如'get')一起工作吗? – Jeff

0

一个简单的方法可能会在水豚中执行一个脚本。只要确保与@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水豚方法太,但我不太确定如何工作可能是值得探讨

+0

谢谢拉蒙这个建议。然而,我只是手动建立一个参数散列,然后发布它的API端点:post'/ incoming',@parameters(我想这是现​​在最简单的可能的解决方案) – GoodGets

+0

所以你使用capybara的post方法? –

+0

我认为这只是一个铁轨瘦? – GoodGets

0

我看到这个答案,昨晚,当我正在更新一些我自己的测试代码为Rails 3.2.8进行,并使用邮件的宝石,并认为我会d分享我发现的内容。测试代码适用于需要从Cloudmailin获取POST的应用程序,然后使用Devise对其进行处理以创建新用户,然后向该用户发送确认信息,然后用户可以根据该确认信息选择密码。这里是我的控制器规格:

require 'spec_helper' 

describe ThankyouByEmailController do 

    message1 = Mail.new do 

    from "Frommy McFromerton <[email protected]>" 
    to "[email protected]" 
    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