컨트롤러가 있습니다.
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
current_account
rspec으로 개인 메서드를 테스트하는 방법 은 무엇입니까?
추신 : Rspec2와 Ruby on Rails 3을 사용합니다.
답변
#instance_eval 사용
@controller = AccountController.new
@controller.instance_eval{ current_account } # invoke the private method
@controller.instance_eval{ @current_account }.should eql ... # check the value of the instance variable
답변
나는 보내기 방법을 사용합니다. 예 :
event.send(:private_method).should == 2
“send”는 개인 메서드를 호출 할 수 있기 때문에
답변
current_account 메소드는 어디에 사용됩니까? 어떤 목적으로 사용됩니까?
일반적으로 개인 메서드를 테스트하지 않고 개인 메서드를 호출하는 메서드를 테스트합니다.
답변
당신은해야 하지 직접 개인 방법을 테스트, 그들이 할 수있는 공공 방법의 코드를 운동에 의해 간접적으로 테스트해야합니다.
이를 통해 테스트를 변경하지 않고도 코드의 내부를 변경할 수 있습니다.
답변
비공개 또는 보호 된 메소드를 공개로 만들 수 있습니다.
MyClass.send(:public, *MyClass.protected_instance_methods)
MyClass.send(:public, *MyClass.private_instance_methods)
이 코드를 테스트 클래스에 배치하고 클래스 이름을 대체하십시오. 해당되는 경우 네임 스페이스를 포함합니다.
답변
require 'spec_helper'
describe AdminsController do
it "-current_account should return correct value" do
class AccountController
def test_current_account
current_account
end
end
account_constroller = AccountController.new
account_controller.test_current_account.should be_correct
end
end
답변
단위 테스트 개인 메서드는 응용 프로그램의 동작과 너무 관련이없는 것 같습니다.
먼저 호출 코드를 작성하고 있습니까? 이 코드는 귀하의 예제에서 호출되지 않습니다.
동작은 다른 개체에서 개체를로드하려는 것입니다.
context "When I am logged in"
let(:user) { create(:user) }
before { login_as user }
context "with an account"
let(:account) { create(:account) }
before { user.update_attribute :account_id, account.id }
context "viewing the list of accounts" do
before { get :index }
it "should load the current users account" do
assigns(:current_account).should == account
end
end
end
end
설명하려는 행동의 맥락에서 테스트를 작성하고 싶은 이유는 무엇입니까?
이 코드가 많은 곳에서 사용됩니까? 보다 일반적인 접근 방식이 필요하십니까?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller