我正在一个Rails API应用中开发reset_password方法。当这个端点被访问时,会排队执行一个ActiveJob,该任务将发送一个请求到Mandrill(我们的事务性电子邮件客户端)。我目前正在尝试编写测试以确保在控制器端点被访问时正确地排队ActiveJob。
def reset_password
@user = User.find_by(email: params[:user][:email])
@user.send_reset_password_instructions
end
send_reset_password_instructions在创建ActiveJob之前会创建一些URL等内容,下面是ActiveJob的代码:class SendEmailJob < ActiveJob::Base
queue_as :default
def perform(message)
mandrill = Mandrill::API.new
mandrill.messages.send_template "reset-password", [], message
rescue Mandrill::Error => e
puts "A mandrill error occurred: #{e.class} - #{e.message}"
raise
end
end
目前我们没有为ActiveJob使用任何适配器,所以我只想用Rspec检查ActiveJob是否已经排队。
目前我的测试大概像这样(我正在使用factory girl创建用户):
require 'active_job/test_helper'
describe '#reset_password' do
let(:user) { create :user }
it 'should create an ActiveJob to send the reset password email' do
expect(enqueued_jobs.size).to eq 0
post :reset_password, user: { email: user.email }
expect(enqueued_jobs.size).to eq 1
end
end
实际情况下一切正常,我只需要创建测试!
我正在使用 Ruby 2.1.2 和 Rails 4.1.6。
我无法在网上找到任何关于如何进行此类测试的文档或帮助,因此非常感激任何帮助!
ActiveJob::TestHelper
旨在与 minitest 一起使用,而不是 rspec。它的代码充满了assert_equal
等语句。仅为一个方法包含它是个坏主意,我认为。此模块中的enqueued_jobs
方法只是ActiveJob::Base.queue_adapter.enqueued_jobs
的快捷方式。 - dre-hhActiveJob::Base.queue_adapter.enqueued_jobs
可以让你访问已经被排队的具体作业。 - Jason Swettexpect { your_action }.to change(enqueued_jobs, :size).by n
,我喜欢使用这种方式来测试没有作业被加入队列的情况,其中 n = 0。使用此方法后,您甚至不必在套件之后清除 enqueued_jobs。 - Miguel Corti