개인 메서드를 지정하는 방법
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
'programing' 카테고리의 다른 글
.git 프로젝트 디렉토리를 어떻게 숨기나요? (0) | 2021.01.18 |
---|---|
elisp를 디버그하는 방법? (0) | 2021.01.18 |
git-add 동안 절대 파일 경로 지정을 피하는 방법 (0) | 2021.01.18 |
모든 텍스트에 대해 Android 앱에서 텍스트 색상을 설정하는 방법은 무엇입니까? (0) | 2021.01.18 |
리눅스의 소켓 버퍼 크기를 찾는 방법 (0) | 2021.01.18 |