2013-07-19 113 views
0

我想为我继承的ActiveAdmin控制器编写测试,并且在检查实例变量正在调用方法时遇到问题。我想要的行为是调用方法的副作用,所以我想确保它被调用。rspec控制器测试实例变量调用方法

这里的控制器:

ActiveAdmin.register User do 
    controller do 
    before_filter :get_user 

    def get_user 
     @user = User.find_by_login(params[:id]) 
     if [email protected] 
     flash[:notice] = "No user found with that login" 
     return false 
     end 
    end 

    end 
    member_action :tos_ban, :method => :post do 
    @user.ban!(current_user, "admin ban", 1) 
    flash[:notice] = "#{@user.display_name} successfully TOS Banned" 
    redirect_back 
    end 
end 

而且,我的规格:

require 'spec_helper' 

describe ActiveAdmin::UsersController do 
    render_views 
    let(:user) { FactoryGirl.create(:user, :admin => admin) } 
    let(:administrator) { FactoryGirl.create(:administrator) } 
    let(:banned_user) { FactoryGirl.create(:user) } 

    before(:each) do 
    login_as(user) 
    session[:last_admin_action_time] = Time.now 
    session[:current_admin_id] = administrator.id 
end 

    describe 'banning users' do 
    context 'as an administrator' do 
     let(:admin) { true } 

     before(:each) do 
     User.should_receive(:ban!).once   # I want something like this 
                # on @user in the controller 
     post :tos_ban, :id => banned_user.login 
     end 

     it 'bans the right user' do 
     assigns(:user).should eq(banned_user) 
     end 
    end 
    end 
end 

编辑:

所以,有点RTFMing后 - 通过RSpec的书 - 我发现我需要使用mocks:

it 'bans the user' do 
    banned_user = mock_model(User) 
    User.stub(:find_by_login).and_return(banned_user) 
    banned_user.should_receive(:ban!) 
    banned_user.should_receive(:display_name) 
    post :tos_ban, :id => banned_user.login 
end 

回答

1

banned_user.should_receive(:ban!)

在您的控制器中,您将记录(用户实例)的引用分配给您的实例变量。你想引用那个实例(不是用户对象和变量)来做出你的断言。