如何设置方法testing中使用的私有实例variables?

给定一个具有几个实例variables和一些方法的类。 一些实例variables可以通过attr_readerattr_accessor访问。 因此,其他人是私人的。
一些私有实例variables在一个实例方法中被设置,并在另一个方法中被读取/使用。

为了testing我正在使用RSpec。 由于我对Ruby还是个新手,想要把所有的东西都弄清楚,所以我把testing定义得相当细致。 因此,每个实例方法都有一个describe块,它们本身被分割成context的一个子集。 一般的环境先决条件与before定义。

但是,当testing其中一个方法,即利用而不是设置一个私有variables时,我需要调用另一个方法,即设置这个variables。 这似乎相当超重,而不是模块化的。

有没有办法强制一个私人实例variables的特定值。 类似于用Object::instance_eval(:var)取出 ”私有实例variables的值。

正如你在你的问题中回答的那样,设置实例variables最简单的方法是使用instance_eval方法:

 obj.instance_eval('@a = 1') 

另一种方法是使用instance_variable_set:

 obj.instance_variable_set(:@a, 1) 

但是我不build议在你的规格中这样做。 规范都是关于对象的testing行为,通过使用instance_eval打破类封装的testing行为将使您的testing更加脆弱和实现相关。

对象状态隔离的另一种方法是存根访问器方法:

 class UnderTest attr_accessor :a def test_this do_something if a == 1 end end #in your test under_test = UnderTest.new under_test.stub(:a).and_return(1) 

使用instance_variable_set

 class SomeClass attr_reader :hello def initialize @hello = 5 end # ... end a = SomeClass.new a.hello # => 5 a.instance_variable_set("@hello", 7) a.hello # => 7