instance_eval()
도움이 될 수 있습니다.
--------------------------------------------------- Object#instance_eval
obj.instance_eval(string [, filename [, lineno]] ) => obj
obj.instance_eval {| | block } => obj
------------------------------------------------------------------------
Evaluates a string containing Ruby source code, or the given
block, within the context of the receiver (obj). In order to set
the context, the variable self is set to obj while the code is
executing, giving the code access to obj's instance variables. In
the version of instance_eval that takes a String, the optional
second and third parameters supply a filename and starting line
number that are used when reporting compilation errors.
class Klass
def initialize
@secret = 99
end
end
k = Klass.new
k.instance_eval { @secret } #=> 99
이를 사용하여 개인용 메소드 및 인스턴스 변수에 직접 액세스 할 수 있습니다.
또한 send()
James Baker가 제안한 것처럼 비공개 및 보호 된 메소드에 액세스 할 수있는
또는 테스트 객체의 메타 클래스를 수정하여 프라이빗 / 보호 된 메소드를 해당 객체에 대해서만 공개 할 수 있습니다.
test_obj.a_private_method(...) #=> raises NoMethodError
test_obj.a_protected_method(...) #=> raises NoMethodError
class << test_obj
public :a_private_method, :a_protected_method
end
test_obj.a_private_method(...) # executes
test_obj.a_protected_method(...) # executes
other_test_obj = test.obj.class.new
other_test_obj.a_private_method(...) #=> raises NoMethodError
other_test_obj.a_protected_method(...) #=> raises NoMethodError
이를 통해 해당 클래스의 다른 객체에 영향을주지 않고 이러한 메소드를 호출 할 수 있습니다. 테스트 디렉토리 내에서 클래스를 다시 열고 테스트 코드 내의 모든 인스턴스에 대해 공개 할 수 있지만 공개 인터페이스 테스트에 영향을 줄 수 있습니다.