【问题标题】:RSpec test for ActiveAdmin member_actionActiveAdmin member_action 的 RSpec 测试
【发布时间】:2020-09-01 23:27:06
【问题描述】:

我的 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"}

【问题讨论】:

    标签: ruby-on-rails ruby rspec activeadmin


    【解决方案1】:

    我个人更喜欢使用功能测试,因为当使用活动管理员时,框架会处理 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
    
    

    【讨论】:

    • 我收到一个错误:NoMethodError: undefined method 'create' for #<RSpec::ExampleGroups::ResetPassword:0x00007fe426207dc8>
    • 你加载了工厂机器人方法吗? ``` config.include FactoryBot::Syntax::Methods```
    • rails_helper - 是的,我做到了
    • 您想用 FactotyBot.create 代替 create 吗?看看它是否有效。
    • NameError: uninitialized constant FactotyBot
    【解决方案2】:

    好的,事实证明,小的调整(在参数中传递 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多