Ruby on rails 3 在Rails 3.1中测试带有小马和RSpec的电子邮件

Ruby on rails 3 在Rails 3.1中测试带有小马和RSpec的电子邮件,ruby-on-rails-3,rspec,pony,Ruby On Rails 3,Rspec,Pony,我试着用它来测试Rails 3.1发送电子邮件的应用程序。发送工作正常,但我很难让测试正常进行。这是我到目前为止所拥有的 spec/spec_helper.rb config.before(:each) do do_not_send_email end . . . def do_not_send_email Pony.stub!(:deliver) # Hijack to not send email. end 在我的用户_controller _spec.rb中 it "sh

我试着用它来测试Rails 3.1发送电子邮件的应用程序。发送工作正常,但我很难让测试正常进行。这是我到目前为止所拥有的

spec/spec_helper.rb

config.before(:each) do
    do_not_send_email
end
.
.
.
def do_not_send_email
    Pony.stub!(:deliver) # Hijack to not send email.
end
在我的用户_controller _spec.rb中

it "should send a greeting email" do
    post :create, :user => @attr
    Pony.should_receive(:mail) do |params|
        params[:to].should == "nuser@gmail.com"
        params[:body].should include("Congratulations")
    end
end
我明白了

失败:

1) UsersController发布“创建”成功后应发送一封问候电子邮件 失败/错误:小马。是否应该接收(:mail)do | params| (小马)。邮件(任何参数) 预计:1次 收到:0次 #./spec/controllers/users\u controller\u spec.rb:121:in'block(4级)in'

看起来小马没有收到电子邮件,但我知道真正的电子邮件正在发送出去


有什么想法吗?

这是我最后的测试结果

it "should send a greeting email" do
    Pony.should_receive(:deliver) do |mail|
        mail.to.should == [ 'nuser@gmail.com' ]
        mail.body.should =~ /congratulations/i
    end
    post :create, :user => @attr
end
Pony.should_receivee需要:deliver(而不是:mail),do/end有点改变,post在设置之后完成


希望这对其他人有帮助。

以下是我最后的测试结果

it "should send a greeting email" do
    Pony.should_receive(:deliver) do |mail|
        mail.to.should == [ 'nuser@gmail.com' ]
        mail.body.should =~ /congratulations/i
    end
    post :create, :user => @attr
end
Pony.should_receivee需要:deliver(而不是:mail),do/end有点改变,post在设置之后完成


希望这对其他人有帮助。

我知道这是一个老问题,但有另一种方法来检验这一点。版本1.10的小马增加了
覆盖选项
。小马用来发送电子邮件
override_options
允许您使用内置在Mail中的TestMailer功能。因此,您可以按如下方式设置测试:

规范内辅助程序

require 'pony'
Pony.override_options = { :via => :test }
在你的测试中

before do
  Mail::TestMailer.deliveries.clear
end

it 'some test' do
  # some code that generates an email
  mail = Mail::TestMailer.deliveries.last
  expect(mail.to).to eql 'some@email.com'
end

我知道这是一个老问题,但有另一种方法来测试这一点。版本1.10的小马增加了
覆盖选项
。小马用来发送电子邮件
override_options
允许您使用内置在Mail中的TestMailer功能。因此,您可以按如下方式设置测试:

规范内辅助程序

require 'pony'
Pony.override_options = { :via => :test }
在你的测试中

before do
  Mail::TestMailer.deliveries.clear
end

it 'some test' do
  # some code that generates an email
  mail = Mail::TestMailer.deliveries.last
  expect(mail.to).to eql 'some@email.com'
end