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

vjn*_*369 1 ruby rspec ruby-on-rails

我有

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
Run Code Online (Sandbox Code Playgroud)

我正在测试继承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
Run Code Online (Sandbox Code Playgroud)

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

And*_*eko 5

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

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

  • 实际上你也应该测试私有方法,但仅限于单元测试.你想知道他们在不同情况下的表现.在集成测试中几乎不可能的东西.但是你不应该测试私有方法,而是测试**集成测试**中的接口. (2认同)