如何设置方法testing中使用的私有实例variables?
给定一个具有几个实例variables和一些方法的类。 一些实例variables可以通过attr_reader
和attr_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