我有
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_controllerbefore 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提前。
答案 0 :(得分:5)
在Ruby / Rails和OOP中,一般私有方法不应该进行测试。您应该测试接口,而不是私有方法的实现。
实施可能会随着时间而改变 - 但它提供的界面(很可能)不会。
答案 1 :(得分:2)
您可以设置env变量,如下所示:
request.env['HTTP_SESSIONTOKEN'] = "..."
用于测试您的私有方法:
controller.instance_eval{ authenticate }.should eql ...