我正在Rails API应用程序中开发重置密码方法.当这个端点被击中时,一个ActiveJob会排队,向Mandrill(我们的事务性邮箱客户端)发出请求.我目前正在try 编写测试,以确保在命中控制器端点时ActiveJob正确排队.

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

send_reset_password_指令在创建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.

我在网上看不到任何关于如何测试的文档或帮助,因此非常感谢您的帮助!

推荐答案

被接受的答案不再适用于我,所以我在 comments 中try 了迈克尔·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相关问答推荐

我使用rbenv安装Ruby,但我在使用";gem";->;错误:执行gem时遇到此错误.(Errno::EACCES)权限被拒绝

RubyOnRail在测试环境中启动失败

为什么没有生成命名空间路由?

根据表单内的 Select 字段值渲染部分内容

如何在 Ruby on Rails 中正确存储 BigDecimal

Rails 上的 build 和 new 有什么区别?

Rails 4 Form: has_many through: checkboxes

Rails 中页面视图的简单计数器

在两个 DateTime 之间迭代,步长为一小时

Rails:如何在表单的必填字段上禁用星号?

为什么 respond_with 被从 rails 4.2 移除到它自己的 gem 中?

我应该将全局共享部分模板放在哪个文件夹中?

在 Devise on Rails beta 3 中创建管理员用户

Ruby on Rails i18n - 想要在模型中翻译自定义消息

通过get in rails传递参数数组

如何在rails中正确使用单选按钮?

Ruby on Rails:Cucumber:我如何获取单个功能?

Ruby 更新后:测试失败,assets资源 未声明为在生产中预编译

ruby on rails 如何处理 NaN

如何删除删除选项表单 activeAdmin?