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