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
これにより、そのクラスの他のオブジェクトに影響を与えることなく、これらのメソッドを呼び出すことができます。テスト ディレクトリ内でクラスを再度開き、テスト コード内のすべてのインスタンスに対して公開することもできますが、公開インターフェイスのテストに影響を与える可能性があります。