用rspec测试控制器的私有方法

时间:2015-11-26 09:25:44

标签: ruby-on-rails ruby rspec

我有

class Api::V1::BaseController < ApplicationController
   before_filter :authenticate!

  private
  def authenticate!
    session_token = request.env["HTTP_SESSIONTOKEN"]
    @current_user = User.where(session_token: session_token).first unless session_token.blank?
    unless @current_user
      return render_json({message: "ERROR: Invalid Session"})
    end
  end

  def current_user
    @current_user
  end 
end

我正在测试继承base_controller

的session_controller
before do 
    post :create, {email: "raj@gmail.com", user_name: "raj",password: "raj"}
    body = JSON.parse(response.body)
    @session_token = body["session_token"]
end

   describe "PUT #edit_email" do
    context "if new email already exist" do
      it "should return with a error message" do
        put :edit_email, {email: "raj@gmail.com", new_email: "ravi@gmail.com", password: "raj"}
        body = JSON.parse(response.body)
        expect(body["message"]).to eq("email already exist")
      end
    end
  end

我是rspec的新手,在这里我对使用session_token调用private authenticate方法很困惑。 如何调用控制器的私有方法并传递header.Thanks提前。

2 个答案:

答案 0 :(得分:5)

在Ruby / Rails和OOP中,一般私有方法不应该进行测试。您应该测试接口,而不是私有方法的实现。

实施可能会随着时间而改变 - 但它提供的界面(很可能)不会。

答案 1 :(得分:2)

您可以设置env变量,如下所示:

request.env['HTTP_SESSIONTOKEN'] = "..."

用于测试您的私有方法:

controller.instance_eval{ authenticate }.should eql ...