【发布时间】:2013-03-23 15:54:10
【问题描述】:
我正在尝试使用 this railscast 为电子邮件添加一些测试,但我得到的是 undefined method 'to' for nil:NilClass。
这些电子邮件实际上是通过使用Sidekiq 的后台工作人员处理的,我知道它们可以正常发送,因为它们在生产中工作,而且它们会在我将require 'sidekiq/testing' 添加到spec_helper.rb 之前发送
所以基本上我的问题是如何在 Sidekiq 中访问电子邮件?我试图让工作人员处理电子邮件,但仍然遇到同样的错误。
spec/support/mailer_macros.rb
module MailerMacros
def last_email
ActionMailer::Base.deliveries.last
end
def reset_email
ActionMailer::Base.deliveries = []
end
end
spec/spec_helper.rb
require 'sidekiq/testing'
...
config.include MailerMacros
config.before(:each) { reset_email }
config/environments/test.rb
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { host: 'localhost:8080' }
控制器/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") } 时,我得到了同样的错误。
【问题讨论】:
-
你可以试试这个吗?
specify { MailerMacros.last_email.should include(@user.email) } -
然后我得到
undefined method 'last_email' for MailerMacros:Module,根据我之前运行的 railscast 和类似宏,last_email应该可以工作。 -
我的错,你是对的,我没有经过适当思考就猜到了。刚刚经历了那个 railscast,它即将到来
nil:NilClass在你的情况下,所以我只能期待一个原因是is the mail actually being sent? -
是的,如果我删除
require 'sidekiq/testing',Sidekiq 实际上会向我的收件箱发送一封电子邮件。
标签: ruby-on-rails email testing rspec sidekiq