ruby-on-rails - 测试邮箱 : last email is nil when sent through a background worker

标签 ruby-on-rails email testing rspec sidekiq

我正在尝试使用 this railscast 为电子邮件添加一些测试,但是我得到了 undefined method 'to' for nil:NilClass

电子邮件实际上是通过后台工作人员使用 Sidekiq 处理的我知道他们发送正确,因为他们在生产中工作,而且他们会在我添加 require 'sidekiq/testing'spec_helper.rb

之前发送

所以基本上我的问题是如何在 Sidekiq 中访问电子邮件?我试图让工作人员处理电子邮件,但仍然出现相同的错误。

规范/支持/mailer_macros.rb

module MailerMacros
  def last_email
    ActionMailer::Base.deliveries.last
  end

  def reset_email
    ActionMailer::Base.deliveries = []
  end
end

规范/spec_helper.rb

require 'sidekiq/testing'
...
config.include MailerMacros
config.before(:each) { reset_email }

配置/环境/test.rb

config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'localhost:8080' }

controllers/tickets_controller.rb

def create
  @ticket = current_user.tickets.build(params[:ticket])   
  if @ticket.save
    Sidekiq::Client.enqueue(TicketNotifier, @ticket.id)
    flash[:success] = "Your ticket has been submitted successfully."
    redirect_to ticket_path(@ticket)
  else
    render 'new'
  end
end

规范的一部分:

require 'spec_helper'

describe "Tickets" do
  subject { page }

  describe "when creating a new ticket successfully" do
    before do
      login_as_user
      visit new_ticket_path
      fill_in "Subject", with: "Test ticket"
      fill_in "Description", with: "This is a test ticket"
      select 'Billing', from: "ticket[category]" 
      click_button "Submit Ticket"
    end

    specify { last_email.to.should include("admin@email.com") }
    # the rest tests the tickets#show view
    it { should have_selector('title', text: "Ticket #1") }
    it { should have_content("ticket has been submitted successfully") }
    ...
  end
end

当我使用 specify { ActionMailer::Base.deliveries.last.to.should include("admin@email.com") } 时,我得到了同样的错误。

最佳答案

当需要 sidekiq/testing 而不是 sidekiq/testing/inline 时,作业被放入队列但直到给出这样的命令才会执行:

Sidekiq::Extensions::DelayedMailer.drain

我在我的规范中使用了这样的辅助方法:

def process_async
  EventWorker.drain
  Sidekiq::Extensions::DelayedMailer.drain
end

EventWorker 可能是我应用程序中的自定义工作程序,Sidekiq::Extensions::DelayedMailer 是 Sidekiq 默认发送延迟邮件的地方。

然后我可以有这样的规范:

#do stuff that should send an email and trigger other sidekiq events
...
process_async
...
#assert the email was sent correctly

在 SideKiq wiki 上对所有这些都有很好的解释:https://github.com/mperham/sidekiq/wiki/Testing

关于ruby-on-rails - 测试邮箱 : last email is nil when sent through a background worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15762675/

相关文章:

ruby-on-rails - 多对多不同查询

ruby-on-rails - 开始在 OS X 10.6 上进行 Rails 3 和 JRails 3 开发

sql-server - 从SQL Server触发器调用Powershell脚本

python - 每种测试方法都有不同的设置/拆卸

javascript - 如何通过匹配文本来选择下拉选项?

testing - 如何为基于 net/http 的代码编写集成测试?

sql - 使用 Postgres 在 SQL 中进行复杂排序

ruby-on-rails - gem 安装是如何工作的? gem 是如何获取安装文件的?

java - 压缩多个 jasper 报告并通过电子邮件发送此 zip

c - 验证电子邮件域的更好方法?