使用rspec测试ActiveAdmin

15

我想开始测试ActiveAdmin,特别是需要测试一个ActiveAdmin控制器中的member_action。

你们知道这个主题有哪些好的教程吗?

谢谢。

3个回答

21

这是我所使用的方法,对我有效:

app/admin/posts.rb

ActiveAdmin.register Post do

  menu :parent => "Admin"


  #path = /admin/posts/:id/comments
  member_action :comments do
   @post = Post.find(params[:id])
  end 
end

管理员文章控制器测试规范(admin/posts_controller_spec.rb)

require 'spec_helper'
include Devise::TestHelpers


describe Admin::PostsController do
  render_views

  before(:each) do
    @user = mock_model(User, :email => "tester@localspecs.com")
    request.env['tester'] = mock(Tester, :authenticate => @user, :authenticate! => @user)
  end

  describe "Get comments" do
    before(:each) do
      @post = Post.create! valid_attributes
      Post.should_receive(:find).at_least(:once).and_return(@post)
      get :comments, :id => @post.id
    end

    after(:each) do
      @post.destroy
    end

    it "gets the proper record to update" do
      assigns(:post).should eq(@post)
    end

    it "should render the actual template" do
      response.should contain("Comments")
      response.body.should =~ /Comments/m
    end
  end
end

我收到一个错误信息:“undefined local variable or method `request' for #RSpec::Core::ExampleGroup::Nested_1:0xd765310”。 - Calin
1
我明白了,我需要将我的规范存储在spec/controllers中,这样Rspec就会自动添加请求方法到我的规范中。 - Calin
2
在这个例子中,Tester是什么? - Jo Erlang

6
# app/admin/post.rb
ActiveAdmin.register Post do
end

# spec/controller/admin/posts_controller_spec.rb
describe Admin::PostsController do
  subject { get :index }
  its(:status) { should eq 200 }
end

2
我遇到了这个错误: 未初始化常量Admin(NameError)请帮忙。 :) - across
2
@across 这是因为你的命名空间可能不同或未加载。也许你正在使用 spec/spec_helper.rb 而不是 spec/rails_helper.rb(提出一个新的堆栈溢出问题将是解决它的方法)。 - Dorian

2
2022年和Rails v7版本的答案
app/admin/dashboard.rb
ActiveAdmin.register_page 'Dashboard' do
  menu priority: 1

  content do
    div class: 'blank_slate_container', id: 'dashboard_default_message' do
      span class: 'blank_slate' do
        span 'Welcome to the Admin'
      end
    end
  end
end

spec/admin/dashboard_controller_spec.rb

RSpec.describe Admin::DashboardController, type: :controller do
  render_views

  it 'redirects to login' do
    get :index

    expect(response).to redirect_to(new_admin_user_session_path)
  end

  context 'when logged in as admin' do
    let(:admin) { create(:admin_user) }

    before { sign_in(admin) }

    it 'renders page' do
      get :index

      expect(response.body).to include('Welcome to the Admin')
    end
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接