用于ActiveAdmin member_action的RSpec测试

问题描述

我的Active Admin面板中有自定义的member_action,负责重新发送设备重置密码说明。

admin/users.rb

ActiveAdmin.register User do

  member_action :reset_password do
    user = User.find(params[:id])
    user.send_reset_password_instructions
    redirect_to(admin_user_path(user),notice: "Password reset email sent to #{user.email}")
  end
end

如何为此类操作编写RSpec测试?我发现的唯一东西是this one,我认为这与我的问题不太相关。

我正试图像下面这样:

require 'rails_helper'

describe Admin::UsersController,type: :controller do
  include Devise::TestHelpers

  let!(:admin) { create(:admin_user) }

  before(:each) do
    sign_in admin
  end

  describe 'GET user' do
    let(:user) { create(:user,:random_email) }

    before(:each) do
      User.should_receive(:find).at_least(:once).and_return(user)
      get :show
    end

    it 'sends email' do
      get :reset_password
      expect(user).should_receive(:send_reset_password_instructions)
    end
  end
end

但是我遇到一个错误

 ActionController::UrlGenerationError:
   No route matches {:action=>"reset_password",:controller=>"admin/users"}

解决方法

我个人更喜欢使用功能测试,因为在使用活动admin时,框架会处理UI内容:

RSpec.feature 'Reset Password',type: :feature do
  let(:user) { create :user }
  
  before do
    login_as(user,scope: :user)
  end

  scenario 'can delete future episode' do
    visit some_path
    click_link 'Reset Password'
    expect(page.current_path).to eq(admin_user_path(user))
    expect(page).to have_content("Password reset email sent to #{user.email}")
  end
end

,

好吧,事实证明,稍作调整(以参数形式传递user.id)就能达到目的。

describe Admin::UsersController,type: :controller do
  include Devise::Test::ControllerHelpers

  before { sign_in admin }

  let!(:admin) { create(:admin_user) }

  describe 'GET user' do
    let(:user) { create(:user,:random_email) }

    before do
      allow(User).to receive(:find).at_least(:once) { user }
      get :show,params: { id: user.id }
    end

    it 'sends email' do
      get :reset_password,params: { id: user.id }
      expect(flash[:notice]).to match("Password reset email sent to #{user.email}")
    end
  end
end

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...