programing

개인 메서드를 지정하는 방법

projobs 2021. 1. 18. 07:29
반응형

개인 메서드를 지정하는 방법


RSpec으로 사양을 지정하고 싶은 개인 메서드가있는 모델
이 있습니다. 일반적으로 어떻게합니까? private 메서드를 호출하는 메서드 만 테스트합니까?
또는 또한 개인을 지정합니까? 그렇다면 어떻게합니까?


저는 항상이 접근 방식을 취 합니다. 클래스가 노출하는 공용 API를 테스트하고 싶습니다.

개인 메서드가있는 경우 다른 클래스에 노출하는 공용 메서드에서만 호출합니다. 따라서 이러한 공용 메서드가 모든 조건에서 예상대로 작동하는지 테스트하면 해당 공용 메서드가 사용하는 개인 메서드도 작동 함을 입증 한 것입니다.

나는 특히 복잡한 사적 방법을 발견했음을 인정할 것이다. 극단적 인 경우 테스트하려는 경우 다음을 수행 할 수 있습니다.

@obj.send(:private_method)

(일시적으로 또는 영구적으로) 코드 커버리지가 필요한 프라이빗 메서드의 경우 rspec-context-private gem 을 사용하여 컨텍스트 내에서 프라이빗 메서드를 일시적으로 공개합니다.

gem 'rspec-context-private'

프로젝트에 공유 컨텍스트를 추가하여 작동합니다.

RSpec.shared_context 'private', private: true do

  before :all do
    described_class.class_eval do
      @original_private_instance_methods = private_instance_methods
      public *@original_private_instance_methods
    end
  end

  after :all do
    described_class.class_eval do
      private *@original_private_instance_methods
    end
  end

end

그런 다음 :private메타 데이터로 describe블록에 전달하면 해당 컨텍스트 내에서 private 메서드가 공개됩니다.

class Example
  private def foo
    'bar'
  end
end

describe Example, :private do
  it 'can test private methods' do
    expect(subject.foo).not eq 'bar'
  end
end

비공개 방법에 대한 기대치를 테스트하려는 경우 허용 된 답변이 실제로 작동하지 않습니다 (적어도 내가 아는 것은 아니기 때문에 그 점에 대해 수정할 수 있습니다). 대신 내가 한 일은 더 더러운 것입니다. 테스트 자체에서 다시 정의하여 메소드를 노출하십시오.

def object_to_test.my_private_method
  super
end

Ruby 1.8에서 작동하며 최신 런타임에 대해 주석을 달 수 없습니다.

참조 URL : https://stackoverflow.com/questions/4154409/how-to-spec-a-private-method

반응형