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