我正在使用Rails API应用程序中的reset_password方法。命中此端点后,将在ActiveJob中排队,这将触发对Mandrill(我们的交易电子邮件客户端)的请求。我目前正在尝试编写测试,以确保在命中 Controller 端点时正确地将ActiveJob排队。

def reset_password
  @user = User.find_by(email: params[:user][:email])
  @user.send_reset_password_instructions
end

send_reset_password_instructions在创建ActiveJob之前会创建一些url等,其代码如下:
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。

我在网络上找不到任何文档或任何有关如何进行测试的帮助,因此将不胜感激!

最佳答案

接受的答案对我不再有用,因此我在评论中尝试了Michael H.的建议,但仍然有效。

describe 'whatever' do
  include ActiveJob::TestHelper

  after do
    clear_enqueued_jobs
  end

  it 'should email' do
    expect(enqueued_jobs.size).to eq(1)
  end
end

关于ruby-on-rails - 如何使用Rspec检查ActiveJob中排队的内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26274954/

10-09 14:05