[ruby-on-rails] Rspec, Rails : 컨트롤러의 프라이빗 메서드를 테스트하는 방법?

컨트롤러가 있습니다.

class AccountController < ApplicationController
  def index
  end

  private
  def current_account
    @current_account ||= current_user.account
  end
end

current_accountrspec으로 개인 메서드를 테스트하는 방법 은 무엇입니까?

추신 : 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