2011-09-30 29 views
3

我控制器如何编写私有方法RSpec的控制器中使用参数

class ApplicationController < ActionController::Base 
    def index 
    end 

    private 

    def handle_login_sequence 
     username = params[:userName] 
     password = params[:password] 

     cookies[:locale] = params[:locale] 
     remember   = params[:remember] 

     username_locked = User.locked_username?(username) 
     user = User.authenticate(username, password) 

     if user && user.has_portal_access? 
     case user.account_status 
      when AccountStatus::Active 
      flash[:error] = 'login' 
     end 
     end 
    end 

end 

我想写Rspec的这种私有方法

@controller = ApplicationController.new 
@controller.send(:handle_login_sequence) 

通过上面的代码,我可以调用handle_login_sequence方法,但我不知道如何通过如下:

params[:userName], params[:password], params[:locale], params[:remember] 
+1

你的规格到目前为止是什么样的? –

+0

当你没有想到它时,你有一个零对象!你可能期望ActiveRecord :: Base的一个实例。评价为零时发生错误。[] (我给出了打印的方法内部) – vinothini

回答

2

你不应该测试一个公司的私人方法直接。相反,测试使用此方法的控制器操作。

不要忘记关于您的控制器的黑匣子隐喻。

Black Box testing diagram

如果测试私有方法,你就必须重写测试时,你想改变的只是执行,而不是接口。黑盒测试将帮助您确保在不直接测试私有方法的情况下不会破坏控制器功能。

+0

从您的文章我理解为不担心输入访问方法而已。这样对吗。如果我调用该方法时不发送显示以下错误的参数 如果您没有预料到它,那么您有一个无对象!你可能期望ActiveRecord :: Base的一个实例。评估nil时发生错误。[] – vinothini

相关问题